1. 機能の概要
ES2016(つまりES7)は2016年6月にリリースされ、わずか2つの新機能のみが含まれています:
配列の包含確認メソッドが1つ、べき乗演算子が1つ。ES2016の新機能はこの2つだけで、どちらも「あれば便利」といった程度のものです。
P.S. 承認済みのその他の機能については、Finished Proposals を参照してください。
2. Array.prototype.includes
配列の includes メソッドは、以下の通りです:
// true | false を返し、含まれているかどうかを示します
// オプション引数の fromIndex は、検索を開始するインデックスを指定します
// デフォルトは 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は等しいとみなされます。
3. Exponentiation operator (べき乗演算子)
べき乗演算子は以下の通りです:
// 底 ** 指数
base ** exponent
また、**= も提供されています:
let n = 2;
// 演算して代入
n **= 4;
n; // => 16
これは 完全に等価 な Math.pow(base, exponent) の別名であり、以下の特殊なケースも含みます:
NaN ** 0; // => 1
Infinity ** 0; // => 1
-5 ** NaN; // => NaN
NaN ** NaN; // => NaN
その通り、完全に等価です。そもそもべき乗演算を再定義することはできません(挙動に不一致があると混乱を招くためです)。
4. なぜこのバージョンはこれほど小さいのでしょうか?
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月にリリースされ、その時点で新たに承認された機能提案が盛り込まれます。そのため、1つのバージョンに含まれる新機能の数は、その年にどれだけの機能がステージ4に到達したかによって決まります。
これにより、仕様として公開される機能が広く審査され確認されていることを保証できる一方で、毎年1回という頻繁なリリースリズムを維持し、ES2015 のような巨大なバージョン(6年かけて1つのバージョンを出すような事態)の再発を防いでいます。
P.S. Ecma TC39 の ES リリースプロセスの詳細については、The TC39 Process を参照してください。
コメントはまだありません