一.特性概覽
ES2016 (也就是 ES7)發布於 2016 年 6 月,僅包含 2 個新特性:
一個陣列包含性檢測方法,一個冪運算子。沒了,ES2016 就這兩個新特性,還都是錦上添花的。的東西
P.S. 更多過審特性,見 Finished Proposals
二.Array.prototype.includes
陣列的 includes 方法,具體如下:
// 返回 true | false,表示包含不包含
// 可選參數 fromIndex 表示從該 index 開始找
// 預設是 0,負數表示倒數第幾個(array.length + fromIndex)
array.includes(item, [fromIndex])
用來確定陣列中是否包含指定元素,類似於(但不等效):
array.indexOf(item) !== -1
二者之間存在細微的差異:
-
NaN:
[NaN].includes(NaN) === true而[NaN].indexOf(NaN) === -1 -
稀疏陣列:
[1, , 3].includes(undefined) === true而[1, , 3].indexOf(undefined) === -1
簡言之, includes 能夠處理 NaN ,並且不會跳過稀疏陣列中的空位(也就是說不判斷陣列中的元素是否存在)
具體的, includes 比較相等性時採用 SameValueZero 演算法:
-
物件僅比較引用
-
基本值比較型別和值
-
值比較中存在 2 個特例,
+0與-0相等,NaN與NaN相等
三.Exponentiation operator
冪運算子,具體如下:
// 底數 ** 指數
base ** exponent
另外,還提供了 **= :
let n = 2;
// 運算並賦值
n **= 4;
n; // => 16
完全等效於 Math.pow(base, exponent) ,包括這些特殊 case:
NaN ** 0; // => 1
Infinity ** 0; // => 1
-5 ** NaN; // => NaN
NaN ** NaN; // => NaN
沒錯,完全等效,因為畢竟冪運算是無法重新定義的(若不一致會引發混亂)
四.為什麼這一版這麼小?
與 ES 發版流程有關, ES 新特性提議分為 5 個階段:
-
stage 0(Strawman):初稿(比 Draft 更草一些)
-
stage 1(Proposal):提議
-
stage 2(Draft):草案
-
stage 3(Candidate):候選提議
-
stage 4(Finished):過審提議
特性提議隨時可以提,多線並行審核推進,但發版週期是固定的:
-
2 月 1 日:產出候選草案(Candidate Draft)
-
2-3 月: 60 天的修訂篩選期(royalty-free opt-out period)
-
3 月 TC39 會議:合入 stage 4(過審的)提議,校準最終語義,並從主分支遷出新規範版本,之後只接受編輯更改
-
4-6 月: ECMA CC 與 ECMA GA 審核期
-
7 月:由 ECMA 大會(ECMA General Assembly)批准新標準
每年 7 月發版,把新過審的特性提議帶上去,所以一個版本包含的新特性數量取決於這一年有多少特性過審了
這樣一方面能夠保證規範發布的特性都經過廣泛審核確認了,另一方面保持每年一版的頻繁節奏,避免再出現 ES2015 那樣的大版本( 6 年憋一版)
P.S. 關於 Ecma TC39 的 ES 發版流程的更多資訊,見 The TC39 Process
暫無評論,快來發表你的看法吧