ECMAScript
第六版已经于2015年发布,某些浏览器已经开始支持ES6
了,这篇文章整理一下ES5
以及ES6
的新特性。html
它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,JavaScript
在它的基础上进行了本身的封装。但其实一般来讲,术语ECMAScript
和JavaScript
指的是同一个东西。
JS
包含三个部分:ECMAScript(核心)
,DOM(文档对象模型)
,BOM(浏览器对象模型)
。ECMAScript
是JS
语言的基础。
ECMAScript
的最新版是第六版ECMAScript 6
,于2015年6月17日发布,截止发布日期,JavaScript
的官方名称是ECMAScript 2015
,是当前最新的正式规范。git
ECMAScript
的各个版本:(从第三版开始说)es6
(1) 第三版ECMAScript3
新增了对正则表达式、新控制语句、try-catch异常处理的支持,修改了字符处理、错误定义和数值输出等内容。标志着ECMAScript成为了一门真正的编程语言。github
(2) 第四版于2008年7月发布前被废弃。正则表达式
(3) 第五版ECMAScript5
力求澄清第3版中的歧义,并添加了新的功能。新功能包括:原生JSON对象、继承的方法、高级属性的定义以及引入严格模式。编程
(4) 第六版ECMAScript6
是继ES5以后的一次主要改进,增添了许多必要的特性,例如:模块和类以及一些实用特性,Maps、Sets、Promises、生成器(Generators)等。json
参考连接:http://www.tuicool.com/articles/vMv6b2z
并非全部浏览器都彻底支持ES5的新特性,好比低版本的IE,可是其余的主流浏览器都支持了,其中IE9不支持ES的严格模式,从IE10开始支持。Safari 5.1不支持Function.prototype.bind
。这也就是说,在移动端能够比较放心地使用ES5。
(1)严格模式
Strict Mode
, 即所谓的严格模式。严格模式的意义是为了提供一种更佳良好错误检查机制,让你规避掉一些语言自己的bad point。
开启严格模式的方法很简单,只须要在文件的顶部写上字符串 use strict
便可。固然这须要执行环境支持严格模式。另外因为use strict
实际上是一个字符串常量。那么即便遇到不支持严格模式的环境,这行字符串只会被安全的忽略,不会带来任何的问题。
好比在严格模式下,咱们不可使用一个未经声明的变量。之前没有用var
声明的变量,会自动成为全局变量,而在严格模式下,会报错。
还有另外一些会出现问题的地方,附连接:
http://www.jb51.net/article/78974.htm
(2)JSON对象
JSON.parse(jsonstr);
//能够将json字符串转换成json对象
JSON.stringify(jsonobj);
//能够将json对象转换成json对符串
(3)新增 Object接口数组
对象 | 构造器 | 说明 |
---|---|---|
Object | getPrototypeOf | 返回对象的原型 |
Object | getOwnPropertyDescriptor | 返回对象自有属性的属性描述符 |
Object | getOwnPropertyNames | 返回一个数组,包括对象全部自有属性名称集合(包括不可枚举的属性) |
Object | create | 建立一个拥有置顶原型和若干个指定属性的对象 |
Object | defineProperty | 给对象定义一个新属性,或者修改已有的属性,并返回 |
Object | defineProperties | 在一个对象上添加或修改一个或者多个自有属性,并返回该对象 |
Object | seal | 锁定对象。阻止修改现有属性的特性,并阻止添加新属性。可是能够修改已有属性的值。 |
Object | freeze | 冻结对象,阻止对对象的一切操做。冻结对象将永远不可变。 |
Object | preventExtensions | 让一个对象变的不可扩展,也就是永远不能再添加新的属性。 |
Object | isSealed | 判断对象是否被锁定 |
Object | isFrozen | 判断对象是否被冻结 |
Object | isExtensible | 判断对象是否能够被扩展 |
Object | keys | 返回一个由给定对象的全部可枚举自身属性的属性名组成的数组 |
比较经常使用的有:浏览器
(4)新增Array接口安全
对象 | 构造器 | 说明 |
---|---|---|
Array.prototype | indexOf | 返回根据给定元素找到的第一个索引值,不然返回-1 |
Array.prototype | lastIndexOf | 方法返回指定元素在数组中的最后一个的索引,若是不存在则返回 -1 |
Array.prototype | every | 测试数组的全部元素是否都经过了指定函数的测试 |
Array.prototype | some | 测试数组中的某些元素是否经过了指定函数的测试 |
Array.prototype | forEach | 让数组的每一项都执行一次给定的函数 |
Array.prototype | map | 返回一个由原数组中的每一个元素调用一个指定方法后的返回值组成的新数组 |
Array.prototype | filter | 利用全部经过指定函数测试的元素建立一个新的数组,并返回 |
Array.prototype | reduce | 接收一个函数做为累加器,数组中的每一个值(从左到右)开始缩减,最终为一个值 |
Array.prototype | reduceRight | 接受一个函数做为累加器,让每一个值(从右到左,亦即从尾到头)缩减为一个值 |
这些都是比较经常使用的,另外,还有一个 Array.isArray()
,用来判断某一对象是否为数组。(typeof
判断的话,返回object
,用instanceof
判断的话,IE
上的返回值不正确)
(5)Function.prototype.bind
bind()方法会建立一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以建立它时传入bind()方法的第一个参数做为 this,传入 bind() 方法的第二个以及之后的参数加上绑定函数运行时自己的参数按照顺序做为原函数的参数来调用原函数。
这个方法能够改变this的指向,为函数自定义 this指针。
Javascript中从新绑定 this变量的语法糖还有 call和 apply 。不过 bind显然与它们有着明显的不一样。 bind将会返回一个新的函数,而 call或者 apply并不会返回一个新的函数,它们将会使用新的 this指针直接进行函数调用。
http://kangax.github.io/compat-table/es5/
http://www.xuebuyuan.com/2122607.html
从这上面看来,IE8只支持defineProperty
、getOwnPropertyDescriptor
的部分特性和JSon的新特性,IE9支持除了严格模式之外的新特性,IE10和其余主流浏览器都支持了。
所以在PC端开发的时候,要注意IE9如下的兼容,移动端开发时,能够比较放心了。
(1)箭头操做符=>
(2)类的支持--class关键字
(3)加强的对象字面量
(4)字符串模板
(5)解构
(6)参数默认值,不定参数,拓展参数
(7)let与const 关键字
(8)for of 值遍历
(9)iterator, generator
(10)模块
(11)Proxies
(12)Symbols
(13)Math,Number,String,Object 的新API
(14)Promises
新特性太多,就不一一详细地写了,具体请看参考文章连接:
http://www.cnblogs.com/Wayou/p/es6_new_features.html
连接:
http://www.xuebuyuan.com/2122607.html
http://kangax.github.io/compat-table/es6/
能够看出来,基本上是没有浏览器彻底支持的,因此仍是不要直接用的好。
可是有转换器 (更准确地说是源代码到源代码的编译器) 能够把ES6转换为被浏览器接受的ES5,好比Babel以及Traceur 之类的项目。其中Babel对 ES6 的支持程度比其它同类更高,并且 Babel 拥有完善的文档和一个很棒的在线交互式编程环境,所以用的比较多。