Ecma International の第 131 回総会(ジュネーブ、6 月 30 日)で ECMA-262 第 17 版、ECMAScript 2026 言語仕様が承認された。追加は次のとおり。

  • Array.fromAsync
  • Error.isError
  • Math.sumPrecise
  • Uint8Array の Base64/hex 変換
  • Iterator.concat
  • JSON.parse の source テキストアクセスと JSON.rawJSON
  • MapWeakMapgetOrInsert

#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"); // false

#Math.sumPrecise

数値のイテラブルを、浮動小数点の精度損失を抑えて加算する。大きさの異なる値を reduce で足し合わせると消えてしまう誤差を避けられる。

js
const values = [1e20, 0.1, -1e20];
values.reduce((a, b) => a + b, 0); // 0
Math.sumPrecise(values); // 0.1

#Uint8Array の Base64/hex

toBase64fromBase64toHexfromHex により、バイト列と文字列の相互変換が組み込みになる。

js
const value = new Uint8Array([69, 83, 50, 48, 50, 54]);
const valueBase64 = value.toBase64(); // 'RVMyMDI2'
Uint8Array.fromBase64(valueBase64); // 元の Uint8Array

#Iterator.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.rawJSONJSON.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'

#参考文献