ECMA TC39パネルは最近、JavaScriptのES2019エディション(ECMAScript 2019とも呼ばれる)の機能を最終化した。ES2019は、配列、オブジェクト、文字列、シンボル、try/catchブロック、JSONの新機能または更新された機能で改善される。
配列は2つの新しいメソッドやプロトタイプがある: flatMap
とflat
。対応するTC39提案仕様ではArray.prototype.flat[ depth ]
は、デフォルト1の「depth
に指定された深さまで再帰的に全てのサブ配列要素を結合して新しい配列を返す。」例えば:
> ['a', ['b','c'], ['d']].flat()
["a", "b", "c", "d"]
> ['a', ['b',['c','e']], ['d']].flat()
["a", "b", ["c", "e"], "d"]
> ['a', ['b',['c','e']], ['d']].flat(2)
["a", "b", "c", "e", "d"]
> ['a', [], ['d']].flat()
["a", "d"]
Array.prototype.flatMap
のT39提案は「マッピング機能を使って各要素をマッピングして、フラット化した結果を新しい配列にする。これは深さ1の平坦化と同じである」。例えば、以下のコードはcond
trueの時に'a'
のみが挿入される:
const cond = false;
const arr = flatten([
(cond ? ['a'] : []),
'b',
]);
ES2019はArray.prototype.sort
は安定したソートである必要があると定義しており、つまり比較して同じだった場合は元の順序である必要がある):
> var items = [
{ name: 'John', value: 37 },
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
> items.sort(function (a, b) {
return a.value - b.value;
});
0: {name: "The", value: -12}
1: {name: "Magnetic", value: 13}
2: {name: "Edward", value: 21}
3: {name: "John", value: 37}
4: {name: "Sharpe", value: 37}
5: {name: "Zeros", value: 37}
6: {name: "And", value: 45}
ES2019はObject
にfromEntries
静的メソッドを追加した。提案では、「Object.fromEntries
はObject.entries
の逆を行うことが提案されている: それはキーと値のペアのイテレータブルを受け取り、自身とキーとそれらのペアによって与えられる対応する値を持つ新しいオブジェクトを返す」
obj = Object.fromEntries([['a', 0], ['b', 1]]);
// { a: 0, b: 1 }
Object.fromEntries
はコンテキストにおいてオブジェクトの作成を単純化する。例えば:
arr = [ { name: 'Alice', age: 40 }, { name: 'Bob', age: 36 } ];
obj = Object.fromEntries(arr.map(({ name, age }) => [ name, age ]));
// {Alice: 40, Bob: 36}
map = new Map([ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]);
obj = Object.fromEntries(map);
// {a: 1, b: 2, c: 3}
文字列の開始と終了にある空白を取り除くString.prototype.trimStart
とString.prototype.trimEnd
という2つの新しいメソッドが追加された:
> ' abc '.trimStart()
"abc "
> ' abc '.trimEnd()
" abc"
Symbol Description Accessorはsymbolの説明を取得するメソッドのSymbol
プロトタイプを取得できる:
> const s = Symbol('The description');
> s.description
"The description"
ES2019ではバインディングが使用されない場合catchバインディングを省略できる:
try {
// 実装されていないかもしれないweb機能を使ってみる
} catch (unused) {
// より広くサポートされている望んでいないweb機能に切り替える
}
これを以下に書き換えれる:
try {
// 実装されていないかもしれないweb機能を使ってみる
} catch {
// より広くサポートされている望んでいないweb機能に切り替える
}
最後ににES2019はほぼ内部で使われている小さな変更が提供されている:
TC39はJavaScriptを進化させる委員会である。そのメンバーは企業(とりわけ主要なブラウザーベンダー)である。ECMAScript機能の提案は、以下の成熟ステージを経る:
- Stage 0: アイディア(Strawman)
- Stage 1: 提案(Proposal)
- Stage 2: 草案(Draft)
- Stage 3: 候補(Candidate)
- Stage 4: 完了(Finished)
機能がStage 4に到達すると、その提案は標準に含まれ、安全に使用できる。ただし、ブラウザーのサポートは標準機能の採用よりも遅れる可能性がある。V8 v7.3 / Chrome 73以降、これらすべてのES2019機能がデフォルトとして提供されている