Ecma International の第 131 回総会(ジュネーブ、6 月 30 日)で ECMA-262 第 17 版、ECMAScript 2026 言語仕様が承認された。追加は次のとおり。
Array.fromAsyncError.isErrorMath.sumPreciseUint8Arrayの Base64/hex 変換Iterator.concatJSON.parseの source テキストアクセスとJSON.rawJSONMap/WeakMapのgetOrInsert
Array.fromAsync
非同期イテレータ、または Promise を yield する同期ジェネレータから配列を作る静的メソッド。これまで for await で手書きしていた収集を一本化できる。
js
async function* asyncGen(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
const arr = await Array.fromAsync(
asyncGen(2024, 2026),
(n) => `ECMAScript ${n}`,
);
// ['ECMAScript 2024', 'ECMAScript 2025', 'ECMAScript 2026']Error.isError
instanceof Error より安全に Error オブジェクトかを判定する。
js
Error.isError(new Error("x")); // true
Error.isError("x"); // falseMath.sumPrecise
数値のイテラブルを、浮動小数点の精度損失を抑えて加算する。大きさの異なる値を reduce で足し合わせると消えてしまう誤差を避けられる。
js
const values = [1e20, 0.1, -1e20];
values.reduce((a, b) => a + b, 0); // 0
Math.sumPrecise(values); // 0.1Uint8Array の Base64/hex
toBase64/fromBase64、toHex/fromHex により、バイト列と文字列の相互変換が組み込みになる。
js
const value = new Uint8Array([69, 83, 50, 48, 50, 54]);
const valueBase64 = value.toBase64(); // 'RVMyMDI2'
Uint8Array.fromBase64(valueBase64); // 元の Uint8ArrayIterator.concat
複数のイテレータ(と挿入する値)を順に消費する単一のイテレータを返す。ジェネレータで yield* を並べる必要がなくなる。
js
const combined = Iterator.concat(
Iterator.from([2022, 2023]),
[2024],
Iterator.from([2025, 2026]),
);
Array.from(combined); // [2022, 2023, 2024, 2025, 2026]JSON.parse の source アクセスと JSON.rawJSON
JSON.parse の reviver に第 3 引数として元の source 文字列が渡る。大きな整数を BigInt として復元したり、JSON.rawJSON で JSON.stringify 時の出力を細かく制御したりできる。
js
JSON.parse("999999999999999999", (key, value, { source }) => BigInt(source));
// 999999999999999999n
JSON.stringify(9999999999999999n, (key, value) => JSON.rawJSON(value));
// '9999999999999999'Map/WeakMap の getOrInsert
キーが未登録のときだけ既定値を入れて返す。存在確認と set の二段処理が不要になる。
js
const settings = new Map([["language", "en"]]);
settings.getOrInsert("theme", "dark"); // 'dark'
settings.getOrInsert("language", "pl"); // 'en'