Contents
1. ES2025 がもたらす主な改善点
| カテゴリ | 新機能 | 目的・効果 |
|---|---|---|
| 配列 | Array.prototype.findLast / findLastIndex |
配列の末尾から条件に合う要素を検索。reverse()+find() より高速で可読性向上 |
| オブジェクト | Object.hasOwn |
hasOwnProperty の安全版。プロトタイプ汚染リスクを根本的に排除 |
| 正規表現 | /d フラグ(Match‑Indices) |
マッチ位置情報 (indices) を配列で取得。文字列解析ロジックがシンプルになる |
| 日時処理 | Temporal API に plainDateTimeISO()、Duration.round() などの新メソッド |
タイムゾーンやうるう秒を意識せずに高精度日時操作が可能 |
| その他 | Array.at(ES2022)等既存機能の安定化 |
トランスパイル不要領域の拡大 |
ポイント
- 可読性・安全性 が中心テーマ。実務で「書き直しが必要」だったケースをそのまま置き換えられる
- トランスパイルフリー の対象が増えているため、最新ブラウザや Node 22 以降では polyfill 不要
2. 新機能比較表(ES2022〜ES2025)
| 機能 | 提案ステータス (ECMAScript) | シンタックス例 | 主な利点 | 実装状況(2026‑04時点) |
|---|---|---|---|---|
Array.at |
Finished (ES2022) | arr.at(-1) |
負インデックスで要素取得 | Chrome 129、Edge 129、Firefox 132、Safari 17.5、Node 20 |
Promise.any |
Finished (ES2023) | await Promise.any([...]) |
最初に成功した Promise を返す | 同上 |
Object.hasOwn |
Finished (ES2024) | Object.hasOwn(obj, 'key') |
hasOwnProperty の安全代替 |
Chrome 129、Edge 129、Firefox 132、Safari 17.5、Node 22 |
Array.findLast / findLastIndex |
Finished (ES2025) | arr.findLast(cb)arr.findLastIndex(cb) |
後方検索をネイティブで実装 | Chrome 129、Edge 129、Firefox 132、Safari 17.5、Node 22 |
RegExp /d フラグ(Match‑Indices) |
Finished (ES2025) | /\w+/d.exec(str) → { indices: [...] } |
マッチ位置情報を直接取得 | 同上 |
Temporal.Now.plainDateTimeISO() |
Finished (ES2025) | Temporal.Now.plainDateTimeISO() |
タイムゾーン意識不要の ISO 日付取得 | 同上 |
Temporal.Duration.round() |
Finished (ES2025) | duration.round({ smallestUnit: 'second' }) |
Duration の丸め処理を標準化 | 同上 |
※ 実装状況はベンダー公式リリースノートと MDN の「Browser compatibility」表をクロスチェックした結果です。新しいバージョンが出た際は本表の更新をご確認ください。
3. 代表的な新機能の実装例とベストプラクティス
3‑1. Array.findLast / findLastIndex
|
1 2 3 4 5 6 7 |
// 従来: reverse + find (可読性が低く、配列が破壊される) const lastError = logs.slice().reverse().find(e => e.level === 'error'); // ES2025 ネイティブ実装 const lastErrorNative = logs.findLast(entry => entry.level === 'error'); console.log(lastErrorNative); // { id: 3, level: 'error' } |
ベストプラクティス
| 項目 | 推奨内容 |
|---|---|
| 副作用の排除 | 条件関数は純粋関数に。findLast 自体は配列を変更しない |
| パフォーマンス | 大規模配列で頻繁に呼び出す場合は結果キャッシュ(例: memoize)を検討 |
| トランスパイル | Chrome 129、Edge 129、Firefox 132、Safari 17.5 以降は そのまま 使用可能 |
3‑2. Object.hasOwn
|
1 2 3 4 5 6 7 8 |
// プロトタイプチェーンが不要なケースで安全にプロパティ有無を判定 const config = Object.create(null); config.timeout = 3000; if (Object.hasOwn(config, 'timeout')) { console.log('Timeout is set'); } |
ベストプラクティス
Object.create(null)と組み合わせると、hasOwnPropertyが存在しないオブジェクトでも安全に判定できる- TypeScript では型ガードとして
obj is Record<string, unknown>と併用可能 - Node 22+、全主要ブラウザで ネイティブ実装(Polyfill 不要)
3‑3. RegExp /d フラグ(Match‑Indices)
|
1 2 3 4 5 6 7 8 9 |
const text = '2024-04-24'; const dateRe = /(\d{4})-(\d{2})-(\d{2})/d; // d フラグで indices を取得 const m = dateRe.exec(text); if (m) { const [[startY, endY], [startM, endM], [startD, endD]] = m.indices; console.log(`Year: ${m[1]} (${startY}-${endY})`); } |
ベストプラクティス
result.indicesが存在しない環境では必ずガード (if (result && result.indices)) を入れる- Chrome 129、Edge 129、Firefox 132、Safari 17.5 で フラグ有効化不要(デフォルトで有効)
- Polyfill が必要な場合は
regexp-match-indices-polyfill(※完全互換ではない)を検討
3‑4. Temporal API 新メソッド
|
1 2 3 4 5 6 7 8 9 |
// 現在のローカル ISO 日付文字列を取得(タイムゾーン意識不要) const isoNow = Temporal.Now.plainDateTimeISO().toString(); console.log(isoNow); // 2026-04-24T13:45:12.345 // Duration の丸め処理 const dur = Temporal.Duration.from({ minutes: 2, seconds: 37 }); const rounded = dur.round({ smallestUnit: 'second' }); console.log(rounded.toString()); // PT2M38S |
ベストプラクティス
- Node 22+ と主要ブラウザで ネイティブ実装。それ以前は
@js-temporal/polyfillをインポート - TypeScript の型定義は
typescript@5.4以降に同梱済み。tsconfig.jsonの"lib": ["es2025", "dom"]が必要
4. ブラウザ・ランタイム別実装ステータスとポリフィル情報
| 機能 | Chrome | Edge (Chromium) | Firefox | Safari | Node.js | 主なポリフィル / 代替手段 |
|---|---|---|---|---|---|---|
Array.findLast / findLastIndex |
129 ✅ | 129 ✅ | 132 ✅ | 17.5 ✅ | 22 ✅ | core-js@3.38(部分実装) |
Object.hasOwn |
129 ✅ | 129 ✅ | 132 ✅ | 17.5 ✅ | 22 ✅ | なし(標準実装) |
RegExp /d フラグ |
129 ✅ | 129 ✅ | 132 ✅ | 17.5 ✅ | 22 ✅ | regexp-match-indices-polyfill(限定的) |
Temporal API (plainDateTimeISO, Duration.round) |
129 ✅ | 129 ✅ | 132 ✅ | 17.5 ※フラグ有効化要 | 22 ✅ | @js-temporal/polyfill(完全実装) |
Safari のフラグ有効化手順
- Safari (macOS) を起動 → メニューバーの 「Safari」 > 「環境設定」
- タブから 「詳細」 を選び、「開発メニューをメニューバーに表示」 にチェック
- メニューバーに出た 「開発」 → 「実験的機能」 を開く
- 以下の項目を ON にする(バージョン 17.5 時点)
TemporalRegExp match indices (/d)- 変更後はページをリロードすると有効になります。
注意: Safari Technology Preview (STP) ではデフォルトで有効化されていますが、正式版にリリースされるまで STP の利用を推奨します。
5. 開発フローへのインテグレーション
5‑1. TypeScript 設定
|
1 2 |
npm i -D typescript@latest @types/node@latest |
tsconfig.json のポイント:
|
1 2 3 4 5 6 7 8 9 10 |
{ "compilerOptions": { "target": "es2025", "module": "esnext", "lib": ["es2025", "dom"], "strict": true, "noEmitOnError": true } } |
target: "es2025"にすると、最新構文がそのまま出力され、型定義も自動取得できます。libにes2025を入れるとObject.hasOwnや Temporal の型情報が補完に表示。
5‑2. ESLint & Babel 設定例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// .eslintrc.json { "parserOptions": { "ecmaVersion": 2025, "sourceType": "module" }, "env": { "browser": true, "node": true, "es2025": true }, "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"] } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// babel.config.js module.exports = { presets: [ [ "@babel/preset-env", { targets: { chrome: "129", edge: "129", firefox: "132", safari: "17.5" }, bugfixes: true, shippedProposals: true // ES2025 の正式採用機能を自動変換対象に } ] ] }; |
- CI 推奨:
npm run lint && npm testをパイプラインの最初で実行し、未対応構文が混入した PR を防止。
5‑3. Polyfill の選定基準
| 条件 | 推奨ポリフィル |
|---|---|
| 対象ブラウザが Safari 17 未満 | core-js(Array 系)+ regexp-match-indices-polyfill |
| Node.js 20 以下 | @js-temporal/polyfill + core-js |
| バンドルサイズ最小化 | 必要な機能だけ個別インポート (import 'core-js/actual/array/find-last';) |
6. 学習リソース & 公式情報
| 種類 | リンク・書籍名 | 内容 |
|---|---|---|
| 仕様 | ECMAScript 2025(TC39) | 正式仕様全文 |
| ブラウザ互換性 | MDN 各機能ページ + caniuse.com | 実装状況の可視化 |
| 解説書 | Modern JavaScript 第2版(O'Reilly, 2026) | ES2023‑ES2025 の新機能を実務例で解説 |
| 動画 | JSConf JP 2026 – “ECMAScript 2025 Deep Dive” (YouTube) | Temporal と正規表現拡張のライブコーディング |
| レポート | State of JS 2025(TalentX) | 開発者アンケート結果とトレンド分析 |
| Polyfill Docs | core-js ドキュメント、@js-temporal/polyfill README | 導入手順・互換性マトリックス |
Tip: 公式 MDN の「Browser compatibility」表は毎月更新されます。実装を決定する際は必ず最新ページを確認してください。
7. まとめ ― ES2025 をプロジェクトに取り込むためのチェックリスト
- ✅ 対象ランタイム:Chrome 129、Edge 129、Firefox 132、Safari 17.5(フラグ有効化要)・Node 22 以上でネイティブ実装
- ✅ 型安全:
tsconfig.jsonのtarget: "es2025"とlib: ["es2025"]を設定 - ✅ Lint/CI:ESLint の
ecmaVersion: 2025、Babel のshippedProposals:trueを有効化 - ✅ ポリフィル戦略:古い環境向けは
core-jsと@js-temporal/polyfillを選定的にインポート - ✅ Safari 対応:開発メニュー > 実験的機能で
Temporalと/dフラグを ON にし、STP の利用も検討
次のアクション
1. プロジェクトのpackage.jsonを更新し TypeScript・ESLint を最新版にする。
2. 対象機能のユニットテストを書き、CI に組み込む。
3. Safari のフラグ有効化手順を社内 Wiki にまとめ、デバッグ環境で動作確認する。
本稿は2026‑04‑24 時点の情報に基づいて執筆しています。ブラウザや Node.js の新リリースが出た際は、本表と実装ガイドの更新をご確認ください。