
ES2026(ECMAScript 2026)の新機能 - Math.sumPrecise から Uint8Array の Base64 まで
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([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(new TypeError()); // true
Error.isError({ name: 'Error', message: 'x' }); // false(ただのオブジェクト)try/catch で受けた値の正規化や、ライブラリ境界でのエラー判定に向きます。
Iterator.concat
複数の iterable を遅延評価で連結します(Iterator Sequencing 提案)。
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メソッドにしたものです。
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 でバイナリを扱うのは罠が多かったので、その正しい代替です。
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 文字列の断片を受け取れるようになります。巨大な整数や高精度の数値を桁落ちなく扱えます。
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 やストリーム)から配列を作ります。
async function* gen() { yield 1; yield 2; yield 3 }
await Array.fromAsync(gen()); // [1, 2, 3]対応状況と使い方の注意
- 多くは新しいランタイムから順次対応。MDN の Baseline では Uint8Array の Base64/Hex は先行(2025年〜)、
Math.sumPrecise・Map.getOrInsert・Iterator.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.escape | ES2025 |
Float16Array / Math.f16round | ES2025 |
| Temporal | Stage 4 到達済みだが、ES2026 の確定7機能には列挙されておらず収録版は要確認 |
とくに using(Symbol.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/Hex。
atob/btoaの正しい後継として早く使える - API 追加が中心なので、当面は polyfill で前倒し採用が現実的
usingは ES2026 ではない・RegExp.escapeは ES2025。版の取り違えと MDN の「2027」ラベルに注意。根拠は TC39 の確定リストへ
派手な新構文は少ないものの、getOrInsert や Base64 変換のように「毎回自前で書いていた定型」を標準が引き取ってくれるのが ES2026 の地味で確実な良さです。


