2025年にJavaScript開発者なら必ず知っておくべき機能
(waspdev.com)- JavaScriptは2025年になっても進化を続けており、あまり知られていないものの非常に便利な機能がある
- 新しい Iterator ヘルパーメソッド は、大規模なデータ変換時により メモリ効率よく 動作する
- 配列の末尾からアクセスできる
at()、シンプルに使えるPromise.withResolvers()、ディープコピー用のstructuredClone()など - Set に対する集合演算 や テンプレート文字列のタグ関数、WeakMap/WeakSet の使い方 は、今でも多くの開発者が見落としている
Iterator Helper メソッド
- 従来の
arr.filter().map()のようにチェーンすると、各段階で新しい配列が生成されて非効率 arr.values().drop(10).take(10).map(...).toArray()のように イテレータベースのチェーン へ改善できる- 主なメソッド:
drop(): 最初の n 個を省略take(): 最初の n 個だけ取得filter(),map(),flatMap(): 配列メソッドと同様に動作reduce(),some(),every(),find(): 条件テストと累積計算をサポートtoArray(): 最終的な配列に変換
- Safari は 2025年3月31日からサポート開始、まだすべてのブラウザが対応しているわけではない
Array at()
arr.at(n)はarr[n]と似ているが、負のインデックスで後ろからアクセス可能- 例:
[10, 20, 30].at(-1)→30 arr[arr.length - 1]のような面倒な書き方をせずに最後の要素へアクセスできる
Promise.withResolvers()
- 従来の方法:
new Promise((resolve, reject) => { ... })で外側にresolve/rejectを保存 - これからは:
const { promise, resolve, reject } = Promise.withResolvers()で 簡潔かつ直感的に利用可能
String.replace() コールバック活用
replace()とreplaceAll()の第2引数には、文字列だけでなくコールバック関数も渡せる- 例:
"X, X, X".replaceAll("X", (match, i) => match + i)→"X0, X3, X6" - 1回でさまざまな置換が可能 → パフォーマンスとメモリの面で効率的
変数の入れ替え(Swap)
- 従来の方法:
temp変数を使用 - 簡潔な方法:
[a, b] = [b, a]による 配列分割代入での変数入れ替え
structuredClone()
JSON.stringify()+JSON.parse()の代わりに、より正確で効率的なディープコピーをサポート- 利点:
NaN,undefined,bigintなどもサポート- 循環参照 も安全にコピー
- 大きなオブジェクトに対して メモリ効率と速度効率が高い
Tagged Template Literals
- テンプレート文字列を特定の関数でパースできる
- HTML エスケープ処理などの 動的な文字列後処理に有用
- 例:
escapeHtmlタグ関数で<br> ${'<br>'}→<br> &lt;br&gt;
WeakMap / WeakSet
- 通常の
Map,Setと似ているが:- キーにはオブジェクトのみ許可(プリミティブ値は不可)
- GC の対象になると自動的に削除される
- 循環参照の可能性がある場合や、副作用なくオブジェクトのメタデータを保存 したいときに適している
Set の集合演算サポート
JavaScript の Set オブジェクトに対して、さまざまな論理演算が新たに追加された:
difference(): 差集合 (A - B)intersection(): 積集合 (A ∩ B)union(): 和集合 (A ∪ B)symmetricDifference(): 対称差集合 (A △ B)isDisjointFrom(): 共通要素がないかどうかisSubsetOf(): 部分集合かどうかisSupersetOf(): 上位集合かどうか
4件のコメント
リテラルをパースすると変数まで文字列として出てくる問題が解決されたようですね。共有ありがとうございます。
例:
"X, X, X".replaceAll("X", (match, i) => match + i) → "X0, X1, X2"例が間違っています。i には一致した位置が入ります。
したがって、結果は
"X0, X3, X6"です。ああ、そうですね。AIが例を誤って作ってしまったようです。修正しておきました。鋭いご指摘ありがとうございます!
valuesは Java の Stream API のような感じなので比較してみたところ、配列サイズが小さい場合はvaluesを使わずにfilterしたほうが速いですね。イテレータベースなので、チェイニングが多くなるほどvaluesを一度通す方式のほうが速くなる効果もありそうです。ベンチマークは https://jsperf.app/dixutu を参照してください。