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