ECMAScript 2015(ES6)新增内容不少,在 ES5 发布近 6 年(2009-11 至 2015-6)以后才将其标准化。两个发布版本之间时间跨度如此之大主要有两大缘由:html
所以,从 ECMAScript 2016(ES7)开始,版本发布将会变得更加频繁,每一年发布一个新版本,这么一来新增内容也会更小。新版本将会包含每一年截止时间以前完成的全部特性。git
TC39(推动 JavaScript 发展的委员会) 设计过程es6
每一个 ECMAScript 特性的建议将会从阶段 0 开始, 而后通过下列几个成熟阶段。其中从一个阶段到下一个阶段必须通过 TC39 的批准。github
什么是 Strawman?web
一个推动 ECMAScript 发展的自由形式的想法。该想法必须由 TC39 的会员提交,若是是非会员则必须注册成为 TC39 贡献者才能提交。数组
必备条件:ecmascript
文件必须在 TC39 的会议上经过审议(原文),而后才能加入阶段 0 的建议页面。单元测试
什么是 Draft?草案是规范的第一个版本。其与最终标准中包含的特性不会有太大差异。测试
必备条件:建议此时必需要附加该特性的语法和语义的正式说明(使用 ECMAScript 标准的形式语言)。说明应该尽量完善,但能够包含待办事项和占位符。该特性须要两个实验性的实现,其中一个能够在相似 Babel 的转译器(transpiler)中实现。this
下一步:从该阶段开始只接受增量调整。
什么是 Candidate?候选阶段,建议基本完成,此时将从实现过程和用户使用两方面获取反馈来进一步完善建议。
必备条件:规范文档必须是完整的。指定的评审人(由 TC39 而不是带头人指定)和 ECMAScript 规范的编辑须在规范上签字。还有至少要两个符合规范的实现(没必要指定默认实现)。
下一步:此后,只有在实现和使用过程当中出现了重大问题才会修改建议。
什么是 Finished?建议已经准备就绪,能够添加到标准之中。
必备条件:建议进入完成阶段以前须要知足如下几点:
下一步: 建议将会尽快加入 ECMAScript 规范之中。当规范经过年度审核成为标准,该建议也正式成为标准的一部分。
已被归入 ES2016 的特性
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法相似
[1, 2, 3].includes(2) // true [1, 2, 3].includes(4) // false
若是传入的值在当前数组(this)中则返回 true,不然返回 false
includes方法与 indexOf 方法很类似 下面两个表达式是等价的:
arr.includes(x) arr.indexOf(x) >= 0
惟一的区别是 includes() 方法能找到 NaN,而 indexOf() 不行:
[NaN].includes(NaN) true [NaN].indexOf(NaN) -1
includes 不会区分 +0 和 -0(这也与其余 JavaScript 特性表现一致):
[-0].includes(+0) true
includes
而不是 contains
? 后者是最初的选择,但在 web 上将会破坏已有的代码(MooTools 在 Array.prototype
上添加了 contains 方法)。includes
而不是 has
? has 一般用于键(Map.prototype.has),includes 一般用于元素(String.prototype.includes)。集合中的元素既能够被看当作 键 也可被当作 值,因此才有 Set.prototype.has (而不是 includes)。String.prototype.includes
方法可用于字符串,而不能用于字符。这是否和 Array.prototype.includes
不一致? 若是数组和字符串的 includes 方法是相同的工做机制,那么数组的 includes 方法就应该接受数组,而不是数组元素了。不过这两个 includes 方法都参考了 indexOf 方法;字符通常是特殊状况,而任意长度的字符串则更常见。新提出来的特性是将 ** 做为指数操做的中缀运算符:
2 ** 2 // 4 2 ** 3 // 8
这个运算符的一个特色是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的。
// 至关于 2 ** (3 ** 2) 2 ** 3 ** 2 // 512
上面代码中,首先计算的是第二个指数运算符,而不是第一个。
指数运算符能够与等号结合,造成一个新的赋值运算符(**=)。
let a = 1.5; a **= 2; // 等同于 a = a * a; let b = 4; b **= 3; // 等同于 b = b * b * b;
注意,V8 引擎的指数运算符与Math.pow
的实现不相同,对于特别大的运算结果,二者会有细微的差别。
99**99 3.697296376497268e+197 Math.pow(99,99) 3.697296376497263e+197