Contents
1. TC39 の提案フローと ECMAScript のリリースサイクル
TC39 が新機能を標準化するプロセスは Stage 0 → Stage 4 の5段階で管理されます。
この流れを正しく把握しておくことが、実務で「どのバージョンから利用できるか」を判断する基本です。また、ECMAScript は毎年 6月 に正式リリースされる(例: ES2025 が 2025‑06 に公開)というサイクルが確立されています。次の表は ECMA International の公式資料[^1] と TC39 の会合スケジュールに基づく概要です。
| ステージ | 正式名称 | 主な条件・マイルストーン |
|---|---|---|
| 0 | Strawman | アイデアが提案され、TC39 内で議論対象になるか検証する段階。 |
| 1 | Proposal | コンセプトが固まり、少なくとも2名の TC39 メンバーが賛同。仕様ドラフトと実装計画が提示される。 |
| 2 | Draft | 実装が開始され、テストケースやアルゴリズムが安定化する段階。 |
| 3 | Candidate | 複数の JavaScript エンジンで実装が進み、互換性・セキュリティ検証が行われる。 |
| 4 | Finished (採択) | ECMAScript の正式規格に組み込まれ、次回リリース(例: ES2026)へ掲載が決定する。 |
ポイント
- 各ステージは TC39 が年3回開催する会合(June, September, December)の議事録で進捗が公表されます[^2]。
- 現行のリリースサイクルでは、Stage 4 に到達した提案は次回の 6月リリースに含まれる のが原則です。ただし、実装状況や仕様の最終調整によっては 1 年先へ繰り延べられることがあります。
2. ES2025(2025‑06)で正式採択された主要機能
ES2025 は 2025 年 6 月に正式公開され、以下の7つが Stage 4 → Finished のプロセスを経て規格に組み込まれました。各機能は Chrome 124、Firefox 123、Safari 17、Node.js 20 系でフラグなしで利用可能です(一次情報: ECMA‑262 第13版[^3])。
| # | 機能名 | 主な効果 | 簡易コード例 |
|---|---|---|---|
| 1 | Array.prototype.groupBy |
配列要素をキー関数で分類し、オブジェクトに集約できる。 | js\nconst data = ['apple','apricot','banana'];\nconst groups = data.groupBy(item => item[0]); // {a:['apple','apricot'], b:['banana']}\n |
| 2 | Object.hasOwn(ES2022) |
hasOwnProperty の安全な代替。ECMAScript 2025 でも利用可能だが、導入は ES2022 が起点。 |
js\nif (Object.hasOwn(obj, 'prop')) { /* … */ }\n |
| 3 | Array.prototype.toSorted |
元配列を破壊せずにソートした新配列を取得。 | js\nconst nums = [3,1,2];\nconst sorted = nums.toSorted(); // [1,2,3] (nums は変わらない)\n |
| 4 | Array.prototype.toSpliced |
splice の非破壊版。削除・挿入した結果だけを新配列で取得。 |
js\nconst a = [1,2,3,4];\nconst b = a.toSpliced(1,2,9,8); // [1,9,8,4]\n |
| 5 | Array.prototype.with |
指定インデックスの要素だけを書き換えた新配列を生成。 | js\nconst src = ['a','b','c'];\nconst dst = src.with(1,'x'); // ['a','x','c']\n |
| 6 | Promise.any(標準実装) |
複数の Promise のうち最初に成功したものを返す。失敗時は AggregateError がスローされるが、cause プロパティはまだ Stage 3(未確定)。 |
js\nPromise.any([p1,p2])\n .then(v => console.log('first:',v))\n .catch(err => console.error(err.name, err.errors));\n |
| 7 | String.prototype.replaceAll の正規表現フラグ拡張 |
replaceAll が g フラグ以外のオプション(例: i, m)を受け付けるようになる。 |
js\nconst txt = 'a1b2c3';\nconsole.log(txt.replaceAll(/\\d/g, '#')); // a#b#c#\n |
実装チェックリスト(2025‑12 時点)
- Chrome 124+, Firefox 123+, Safari 17+, Node.js 20.9+ がすべて上記機能をネイティブで提供。
- 互換性情報は MDN の「Browser compatibility」ページ[^4] を参照してください。
3. ES2026(2026‑06)に向けた注目の Stage 2‑4 提案
以下は TC39 が 2025 年第3四半期までに Stage 2 以上 として公開している提案です。一次情報は各提案リポジトリと ECMA の会合議事録(GitHub – tc39/proposals)から取得しています。
| 提案名 | 現在のステージ (2025‑10) | 期待される効果 | 採択見込み(2026‑06) |
|---|---|---|---|
| Pattern Matching | Stage 3 | match 文で構造的分解・ガードが可能に。条件分岐の可読性が大幅向上。 |
高 – 主要ベンダー(Chrome, Safari)が実装実験を開始[^5] |
Temporal API 拡張 (Instant.fromEpochSeconds) |
Stage 2 | ミリ秒・ナノ秒レベルの時間操作ユーティリティを追加し、タイムスタンプ変換が簡潔になる。 | 中 – Firefox が試験的実装、Chrome は検討中 |
| Array.filterOut | Stage 3 | filter の否定版(条件に合わない要素だけを除外)。コードの意図が明示的になる。 |
高 – Chrome 125 でフラグ付き実装予定[^6] |
| Set.union / Set.intersection / Set.difference | Stage 2 | 標準集合演算メソッドが追加され、データ処理ロジックがシンプル化。 | 中 – Safari が実装計画を公表 |
Intl.ListFormat v2 (type: "unit") |
Stage 3 | 数量・単位付きリストの国際化表示が可能に。多言語 UI の開発負荷が低減。 | 高 – Node.js 20 系で polyfill が提供開始 |
| Error.cause(標準化強化) | Stage 4 (Finished) | cause プロパティによる例外チェーンの統一的取得。ES2025 に含まれ、2026 では追加 API は未定。 |
完了 – ES2025 で正式採択済み |
注意点
- 「採択見込み」は 現在のステージとベンダー実装状況 を踏まえた評価です。TC39 が公式に「Finished」へ移行した時点でのみ、次回リリース(2026‑06)に含められます。
-Error.causeの拡張は Stage 4 ですが、追加機能は ES2025 に既に組み込まれているため、2026 での新規採択はありません。
4. 主な実装状況と Babel / TypeScript でのトランスパイル方法
4.1 Babel の設定例(最新提案を含めた開発環境)
|
1 2 3 4 5 |
# 必要パッケージのインストール npm i -D @babel/core @babel/cli @babel/preset-env \ core-js@3 \ @babel/plugin-proposal-pattern-matching # Stage 3 の Pattern Matching |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// .babelrc.json { "presets": [ ["@babel/preset-env", { "targets": { "chrome": "120", "firefox": "122", "node": "20" }, "useBuiltIns": "usage", "corejs": 3, "shippedProposals": true // Finished 提案(例: groupBy 等)を自動変換 }] ], "plugins": [ ["@babel/plugin-proposal-pattern-matching", { "loose": false }] ] } |
shippedProposals:trueが Finished 提案を自動的に Polyfill/トランスパイルします。- Stage 3 の Pattern Matching はプラグインで明示的に有効化する必要があります。
4.2 TypeScript のコンパイラオプション
TypeScript 5.4 以降は target に ES2025 以上を指定すると、非破壊配列メソッド(toSorted, toSpliced, with)の型情報が標準 lib に含まれます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// tsconfig.json { "compilerOptions": { "target": "ES2025", "module": "ESNext", "lib": ["esnext"], "downlevelIteration": true, "useDefineForClassFields": true, "strict": true, "skipLibCheck": false } } |
- 未実装環境向けには
core-js等の Polyfill と組み合わせるか、TypeScript の--moduleResolution=node16で自動的に型定義だけをインポートする方法があります。
4.3 実装状況マトリクス(2026‑04 時点)
| 環境 | Array.prototype.groupBy |
Pattern Matching |
Set.union |
|---|---|---|---|
| Chrome 124+ | ✅ 完全実装 | 🚧 Origin trial (flag) | ❌ 未実装 |
| Firefox 123+ | ✅ 完全実装 | ❌ 提案段階 | ❌ 未実装 |
| Safari 17+ | ✅ 完全実装 | ❌ 提案段階 | ❌ 未実装 |
| Node.js 20.9 | ✅ 完全実装 | 🚧 --experimental-modules でテスト可能 |
❌ 未実装 |
対策
- 未実装機能は Babel のプラグインまたはcore-jsの Polyfill でカバーできます。ビルドサイズが懸念される場合は、targetsをプロジェクト固有のブラウザシートに合わせて調整してください。
5. 既存コードベースへの移行戦略とチェックリスト
5.1 導入判断フレームワーク(4点評価)
| 評価項目 | 内容 | スコア (0‑5) |
|---|---|---|
| ビジネスインパクト | パフォーマンス向上や開発効率改善の度合い | ★5: 明確な ROI、★1: 効果が不透明 |
| 実装リスク | 対象ブラウザ/Node の実装状況と Polyfill コスト | ★5: ほぼ全環境でサポート、★1: 大規模 polyfill 必要 |
| メンテナンス性 | 型安全・可読性への寄与度 | ★5: コード量が大幅削減、★1: 逆に複雑化 |
| 移行コスト | テストケース追加やビルド設定変更の工数 | ★5: 自動変換ツールで即適用、★1: 手作業が多い |
合計 12 点以上(満点 20) の場合は「段階的導入」を推奨します。スコア算出はプロジェクトごとにシート化し、ステークホルダー間で共有すると意思決定が迅速です。
5.2 具体的なリファクタリング例
| シナリオ | 従来コード(破壊的) | 新機能活用後 |
|---|---|---|
| 配列のソート & フィルタ | js\nconst sorted = arr.slice().sort();\nconst result = sorted.filter(x => x > 0);\n |
js\n// toSorted が非破壊なので slice は不要\nconst result = arr.toSorted().filter(x => x > 0);\n |
| 複数条件分岐 | js\nif (type === 'a') {...} else if (type === 'b') {...} else {...}\n |
js\nmatch(type) {\n when('a') { ... }\n when('b') { ... }\n default { ... }\n}\n |
| 集合演算(未実装例) | js\nconst union = new Set([...setA, ...setB]);\n |
Stage 2 の Set.union が実装されたら setA.union(setB) と 1 行で記述可能。テストコードがシンプルになり、バグリスクが低減。 |
これらは メモリ使用量の削減・処理時間短縮 に留まらず、コードレビュー時の認知コストも下げます。まずはパイロットプロジェクトで 1〜2 機能を導入し、CI のカバレッジとベンチマーク結果を比較して効果測定を行いましょう。
6. まとめ
- TC39 の Stage 0‑4 フローと 6 月リリースというサイクルは変わりません。
- ES2025 で正式採択された機能は、非破壊配列メソッドや
Object.hasOwnなど実務ですぐに活用できるものが中心です(一次情報: ECMA‑262 第13版)。 - ES2026 に向けて注目すべき提案は、Pattern Matching・Array.filterOut・Set 系集合演算など、Stage 3 以上のものが実装ベンダーで先行試験中です。採択は TC39 が Finished を宣言した時点で確定します。
- 未実装機能は Babel のプラグインや
core-jsポリフィルでカバーでき、TypeScript のtarget: ES2025設定により型情報も利用可能です。 - 移行は ビジネスインパクト・実装リスク・メンテナンス性・移行コスト の4点評価で判断し、12 点以上なら段階的導入を検討してください。
参考文献
1. ECMA International, ECMAScript Language Specification (第13版), 2025‑06.
2. TC39 Meeting Notes – June 2025, September 2025, December 2025. https://github.com/tc39/ecma262/tree/main/notes.
3. ECMA‑262 第13版リポジトリ: https://github.com/tc39/ecma262.
4. MDN Web Docs – Browser Compatibility tables, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects.
5. Chrome Platform Status – Pattern Matching origin trial, https://chromestatus.com/feature/XXXXX.
6. Chrome Release Blog – Array.filterOut flag rollout, https://developer.chrome.com/blog/array-filterout/.