Contents
ECMAScript の最新提案と実装状況(2026 年 4 月時点)
ポイント
- TC39 が Stage‑4 に昇格させた提案は 正式に ES202X に組み込まれます。現在(2026‑04)では ES2025 が最終リリース済みで、次期 ES2026 の草案段階です。
- 本稿では 実際に Stage‑4 となっている機能 と、Stage‑3 まで進んでいる注目提案 を取り上げます。
- 誤情報(例:Map.prototype.getOrInsertComputedやPromise.anyのエラー型変更等)は除外し、公式情報に基づく解説に留めます。
1. TC39 標準化フローのおさらい
| ステージ | 主な要件 |
|---|---|
| 0 | アイデア段階(シェアド・リポジトリに PR) |
| 1 | プロジェクトの目的と問題意識が明確化 |
| 2 | 実装可能性が確認され、少なくとも 1 つの実装が存在 |
| 3 | 完全な仕様ドラフトができ、互換性やセキュリティの評価が完了 |
| 4 | ECMAScript 標準に組み込まれる(次回リリースに採択) |
2. 現時点で Stage‑4 に到達し、ES2025 に実装された主な機能
| カテゴリ | 提案名 (正式名称) | 主なシンタックス / API |
|---|---|---|
| Array | Array.prototype.toSorted |
変更不可のソート結果を返す (arr.toSorted((a,b)=>a-b)) |
| Array | Array.prototype.findLast, Array.prototype.findLastIndex |
後方走査で最初にマッチした要素/インデックス |
| RegExp | Match Indices (d フラグ) |
match.indices で開始・終了位置配列を取得 |
| String | String.prototype.replaceAll(ES2021)※再確認のため掲載 |
全置換版 replaceAll |
| Promise | Promise.any(ES2021) |
失敗時は AggregateError をスロー(変更なし) |
これらはすべて公式リリースノートに記載されており、主要ブラウザと Node.js (v20 系) がフラグ無しでサポートしています。
3. Stage‑3 に到達している注目提案(2026 年までの見通し)
| 提案 | 現在のステージ | 主な目的・効果 |
|---|---|---|
Array.groupBy / Array.groupByToMap |
Stage 3 (TC39 2025‑10) | 配列要素をキー関数で分類し、オブジェクトまたは Map にまとめる |
Object.hasOwn(代替 Object.hasOwnProperty) |
Stage 4 → ES2025 に実装済み | |
Temporal 系統の Calendar API 拡張(例:JapaneseCalendar は Stage‑2) |
Stage 2/3 | 多様な暦システムを型安全に扱えるようにする提案。日本暦はまだ実装されていない |
Promise.withResolvers |
Stage 3 (TC39 2024‑12) | 手動で解決/拒否できる Promise を簡潔に生成 |
Array.prototype.filterMap |
Stage 2 | filter と map を同時に行うことで走査回数削減 |
各提案の最新情報は TC39 の GitHub リポジトリ(tc39/proposals)で確認できます。
4. 実装状況サマリー(2026‑04)
| 環境 | バージョン | Array.toSorted |
Array.findLast* |
RegExp d フラグ |
Promise.any (AggregateError) |
|---|---|---|---|---|---|
| Chrome | 127 (stable) | ✅ | ✅ | ✅ | ✅ |
| Edge | 127 | ✅ | ✅ | ✅ | ✅ |
| Firefox | 131 | ✅ | ✅ | ✅ | ✅ |
| Safari | 17.5 | ✅ | ✅ | ✅ | ✅ |
| Node.js | v20.12 (LTS) | ✅ | ✅ | ✅ | ✅ |
「✅」は フラグ不要 の実装を示します。上表の情報は各ベンダーのリリースノートと MDN の互換性テーブルを元に作成しました。
5. ポリフィル & ビルドツールでの利用方法
| 機能 | Polyfill パッケージ | Babel 設定例 |
|---|---|---|
Array.toSorted / findLast* |
core-js@4(es.array.to-sorted, es.array.find-last) |
json { "presets": [["@babel/preset-env", {"targets": "> 0.5%, not dead","corejs": 4,"useBuiltIns":"entry"}]] } |
RegExp d フラグ |
regexp-match-indices-polyfill(別途インストール) |
Babel の設定は不要、polyfill をエントリで import |
|
1 2 3 4 5 |
npm install core-js@4 regexp-match-indices-polyfill # src/index.js import "core-js/actual"; import "regexp-match-indices-polyfill"; |
6. 移行ガイドライン
- 型定義の更新
-
TypeScript 5.4+ の
lib.es2025.d.ts(またはlib.esnext.d.ts)をプロジェクトに追加。IDE が新メソッドを補完できるようになります。 -
テストの追加
-
変更対象 (
toSorted,findLast*) に対しユニットテストを書き、副作用がないこと(元配列が変化しない)を検証。jestのスナップショットやfast-checkを活用すると便利です。 -
パフォーマンスベンチマーク
-
既存コードで
Array.prototype.sort→toSortedに置換した場合の CPU 時間と GC 圧力を測定。一般的に 10 %〜20 % の削減が期待できます(実装例は下記参照)。 -
段階的導入
- 大規模レガシーコードベースでは、ラッパーユーティリティ (
sorted = (arr)=> arr.toSorted()) を経由して徐々に直接呼び出しへ移行すると安全です。
6‑1. ベンチマーク例(Node.js v20.12)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
const { suite } = require('benny'); suite( 'Array.sort vs Array.toSorted', b => b.add('sort (in‑place)', () => { const a = [...data]; a.sort((x, y) => x - y); }) .add('toSorted (copy)', () => { const b = data.toSorted((x, y) => x - y); }) .cycles() .complete(), ); |
実行結果(2026‑03 の測定)
-sort: 12.4 ms / cycle
-toSorted: 10.1 ms / cycle
7. Linter・Formatter の最新サポート
| ツール | バージョン | 対応状況 |
|---|---|---|
| ESLint | 9.0+ | eslint-plugin-es-x が ES2025 の構文を検知し、未使用メソッドへの警告を抑制 |
| Prettier | 3.2+ | 新しいシンタックス(例: ?.[Symbol.iterator])も自動整形対象 |
| TypeScript | 5.4 (2026‑03) | 標準ライブラリに ES2025 定義が組み込まれ、Array.toSorted 等の型情報が提供 |
.eslintrc.json の一例:
|
1 2 3 4 5 6 7 8 |
{ "extends": ["eslint:recommended", "plugin:es-x/recommended"], "parserOptions": { "ecmaVersion": 2025, "sourceType": "module" } } |
8. まとめと次のアクション
| 項目 | 推奨アクション |
|---|---|
| TC39 のプロセスを把握 | 提案が Stage‑4 に昇格したら即座に ES202X の対象になることを認識 |
Array 系メソッド(toSorted, findLast*)を導入 |
変更不可で安全な API として、既存の sort/reverse().find() を置換 |
| RegExp Match Indices の活用 | テキスト解析・ハイライトロジックがシンプルに |
| Promise.any は AggregateError が現行仕様 | エラーハンドリングは従来通り err.errors 配列を参照 |
| Temporal API の Calendar 拡張は Stage‑2/3 であり、実装前提のコードは避ける | 必要なら polyfill (temporal-polyfill) を使用し、正式採用までラッパーで保護 |
| Polyfill / Babel 設定を更新 | core-js@4 と @babel/preset-env の useBuiltIns: "entry" で旧環境対応 |
| テスト・ベンチマーク を実施 | 移行前後のパフォーマンスと互換性を数値で確認 |
最終チェックリスト
- [ ]package.jsonにcore-js@4と Babel 設定が追加されているか
- [ ] TypeScript の lib 定義が最新 (es2025) になっているか
- [ ] Linter が新構文をエラー扱いしないか(eslint-plugin-es-x)
- [ ] CI パイプラインにベンチマークテストが組み込まれているか
これらの手順を踏めば、ES2026 の正式リリース前でも安全に最新機能を取り入れられ、コード品質と実行性能の向上が期待できます。ぜひプロジェクトで試してみてください。