ES2026(ECMAScript 2026)の新機能 - Math.sumPrecise から Uint8Array の Base64 まで

ES2026(ECMAScript 2026)の新機能 - Math.sumPrecise から Uint8Array の Base64 まで

作成日:
読了:11
更新日:

ECMAScript は毎年6月に新しい年次版が承認されます。2026年版が ES2026(ECMAScript 2026・第17版)。この記事では、ES2026 で標準入りする機能を、TC39 の確定リスト(finished-proposals)と公式仕様スナップショット(tc39.es/ecma262/2026/を一次ソースに整理します。

ネット上の情報は「どの機能がどの版か」が驚くほど錯綜しています。そこで本記事は「ES2026 に確実に入る7機能」に絞り、よくある版の取り違え(using は ES2026 ではない、RegExp.escape は ES2025 など)も最後にまとめます。

ES2026 とは

ECMAScript の機能は TC39 の Stage プロセス(0〜4)で進み、Stage 4(finished)に到達した提案だけがその年の版に取り込まれます。ES2026 は第17版で、確定スナップショットは公式に存在します(収録内容は確定済み)。直前の ES2025 は第16版です。

TC39 の finished-proposals.md で「Expected Publication Year = 2026」とされ、かつ ES2026 仕様の Introduction に列挙されているのは、次の7件です。

機能何ができるか
Math.sumPrecise数値の iterable を精度を保って合計
Error.isError値が Error 実体かを確実に判定
Iterator.concat複数の iterable を遅延連結
Map/WeakMap の Upsertキー未存在時に既定値を挿入して取得
Uint8Array の Base64/Hexバイナリと Base64/Hex 文字列の相互変換
JSON.parse の source アクセスパース時に元の JSON 文字列へアクセス
Array.fromAsync非同期 iterable から配列を構築

順に見ていきます。

Math.sumPrecise

数値の iterable を、浮動小数点の誤差を最小化して合計します。素朴な加算で起きる桁落ちを避けられます。

Math.sumPrecise
Math.sumPrecise([1e20, 0.1, -1e20]); // 0.1(素朴な + では 0 になりがち)
Math.sumPrecise([1, 2, 3]);          // 6
// 空の iterable は -0 を返す

会計・科学計算・座標の累積など、桁の差が大きい数値を足す場面で効きます。

Error.isError

値が本物の Error インスタンスかを判定します。instanceof Error は iframe や Worker などレルムをまたぐと false になる問題がありますが、Error.isError はそれを回避します。

Error.isError
Error.isError(new TypeError()); // true
Error.isError({ name: 'Error', message: 'x' }); // false(ただのオブジェクト)

try/catch で受けた値の正規化や、ライブラリ境界でのエラー判定に向きます。

Iterator.concat

複数の iterable を遅延評価で連結します(Iterator Sequencing 提案)。

Iterator.concat
const it = Iterator.concat([1, 2], new Set([3, 4]), (function* () { yield 5 })());
[...it]; // [1, 2, 3, 4, 5]

配列に展開してから結合する [...a, ...b] と違い、必要になるまで評価されないのが利点です。

Map / WeakMap の Upsert(getOrInsert)

「キーがあればその値を、なければ既定値を挿入してから返す」という頻出パターンを1メソッドにしたものです。

getOrInsert / getOrInsertComputed
const map = new Map([['a', 1]]);
map.getOrInsert('a', 0); // 1(既存)
map.getOrInsert('b', 0); // 0(同時に b:0 を挿入)
 
// multimap の定番
map.getOrInsert(key, []).push(value);
 
// 既定値の生成が高コストなら、未存在時だけ評価する版
map.getOrInsertComputed(key, () => expensiveDefault());

if (!map.has(k)) map.set(k, ...) の定型を置き換えられます。

Uint8Array の Base64 / Hex 変換

バイナリ(Uint8Array)と Base64 / Hex 文字列を直接変換できます。これまで atob/btoa でバイナリを扱うのは罠が多かったので、その正しい代替です。

Base64 / Hex
new Uint8Array([72, 105]).toBase64();   // "SGk="
Uint8Array.fromBase64('SGk=');          // Uint8Array [72, 105]
 
// URL セーフな Base64 や Hex も
new Uint8Array([255, 0]).toBase64({ alphabet: 'base64url' });
Uint8Array.fromHex('48656c6c6f');       // "Hello" のバイト列

ES2026 の7機能の中では最も実装が先行しており(MDN の Baseline では2025年から利用可)、いちばん実務投入しやすい機能です。

JSON.parse の source アクセスと JSON.rawJSON

JSON.parse の reviver が元の JSON 文字列の断片を受け取れるようになります。巨大な整数や高精度の数値を桁落ちなく扱えます。

reviver の source 引数 / JSON.rawJSON
const obj = JSON.parse('{"big": 12345678901234567890}', (key, value, ctx) => {
  if (key === 'big') return BigInt(ctx.source); // 元の文字列から精度を保って復元
  return value;
});
 
// 逆方向: 数値の見た目を保って出力
JSON.stringify({ x: JSON.rawJSON('1.0') }); // {"x":1.0}

API が返す巨大 ID を number にして壊す、という事故を防げます。

Array.fromAsync

Array.from非同期版。非同期 iterable(async generator やストリーム)から配列を作ります。

Array.fromAsync
async function* gen() { yield 1; yield 2; yield 3 }
await Array.fromAsync(gen()); // [1, 2, 3]

対応状況と使い方の注意

  • 多くは新しいランタイムから順次対応。MDN の Baseline では Uint8Array の Base64/Hex は先行(2025年〜)Math.sumPreciseMap.getOrInsertIterator.concat は2026年に利用可、Error.isError はまだ限定的、という状況です
  • これらは構文ではなくランタイム API の追加using を除く)なので、当面は polyfill(core-js / es-shims)を入れるのが現実的です

WARNING

MDN の版表記に注意。 MDN は Math.sumPrecise などのページで「ECMAScript 2027」とラベルしていることがあります。これは MDN が進行中のライブ草案(現在2027版として更新中)へリンクしているためで、凍結済みの ES2026 仕様(tc39.es/ecma262/2026/)と finished-proposals が定義する「ES2026 収録」という事実とは別物です。版の根拠は MDN のラベルではなく TC39 の確定リストに置くのが安全です。

よくある版の取り違え

最後に、ES2026 と混同されやすい機能を整理します。

機能実際の版
using / await using(明示的リソース管理)ES2026 ではない(finished-proposals の2026欄に無い。ES2027 以降の見込み。実装は先行)
RegExp.escapeES2025
Float16Array / Math.f16roundES2025
TemporalStage 4 到達済みだが、ES2026 の確定7機能には列挙されておらず収録版は要確認

とくに usingSymbol.dispose による確定的なリソース解放)は「ES2026 の目玉」と紹介されることがありますが、TC39 の確定リストには入っていません。記事や資料で見かけても、版の出典を確かめてください。

まとめ

  • ES2026 は ECMAScript 第17版。確定収録は Math.sumPrecise / Error.isError / Iterator.concat / Map・WeakMap の Upsert / Uint8Array の Base64・Hex / JSON.parse の source アクセス・JSON.rawJSON / Array.fromAsync の7機能
  • 実装が最も進むのは Uint8Array の Base64/Hexatob/btoa の正しい後継として早く使える
  • API 追加が中心なので、当面は polyfill で前倒し採用が現実的
  • using は ES2026 ではない・RegExp.escape は ES2025。版の取り違えと MDN の「2027」ラベルに注意。根拠は TC39 の確定リストへ

派手な新構文は少ないものの、getOrInsert や Base64 変換のように「毎回自前で書いていた定型」を標準が引き取ってくれるのが ES2026 の地味で確実な良さです。

参考リンク

TypeScript 6.0 の新機能と破壊的変更 - JavaScript製で書かれる最後のコンパイラ

TypeScript 6.0 の新機能と破壊的変更 - JavaScript製で書かれる最後のコンパイラ

10

TypeScript 6.0(2026年3月23日リリース)を公式アナウンスとリリースノートをもとに整理します。6.0 が「JavaScript製の最後のコンパイラ」であり 7.0(Go製・Project Corsa)へのブリッジである位置づけ、this を使わない関数の推論改善・#/ サブパスインポート・es2025 lib・Temporal 型などの新機能、そして strict や module/target の既定値変更、amd/umd や outFile の削除、module 名前空間構文や import assert の廃止といった破壊的変更、ignoreDeprecations や stableTypeOrdering による移行までを一次ソースでまとめます。