文字列連結の「正解」を知っているか?—パフォーマンスとメモリ効率の深淵
現場でコードレビューをしていると、未だに「とりあえず `+` で繋いでおけばいいや」という実装を見かけることがある。もちろん、数個の変数を結合する程度ならそれでいい。だが、もし君が数千、数万件のデータを扱うUIコンポーネントや、巨大なログを出力するロジックを書いているなら、その「適当な連結」はメモリの無駄遣いであり、ガベージコレクション(GC)を頻発させる元凶になりかねない。
今日は、JavaScriptの文字列連結という、一見地味だが奥の深い領域について、エンジン内部の挙動まで踏み込んで整理してみよう。
—
1. なぜ「文字列連結」は議論の的になるのか
JavaScriptの文字列は「イミュータブル(不変)」だ。一度作成された文字列は、メモリ上のどこかに固定され、書き換えることはできない。つまり、`str += ‘a’` と書いた瞬間、JavaScriptエンジンは裏側で「既存の文字列をコピーし、新しい文字を足した新しいメモリ領域を確保する」という処理を行っている。
これをループの中で繰り返すとどうなるか。メモリ上には不要になった旧文字列の残骸が散らばり、ブラウザはそれらを片付けるために必死でGCを走らせることになる。これがパフォーマンス低下の正体だ。
2. 実践的アプローチ:比較と最適化
現代のJavaScriptエンジン(V8など)は非常に賢い。しかし、エンジンの最適化に頼り切るのではなく、我々開発者がコストを意識した実装を選ぶべきだ。
A. テンプレートリテラル (ES6+)
可読性は最強だ。多くのケースで第一候補となる。
// 読みやすく、メンテナンス性が高い
const name = “フロントエンド”;
const status = “最適化中”;
const log = `[System]: ${name}は現在${status}です。`;
現場の知見: 単発の連結ならこれ一択。エンジン側でも十分に最適化されているため、無理に他の手法に変える必要はない。
B. Array.join(”)
古くからあるテクニックだが、実は今でも「大量の文字列をループで生成する」際には非常に強力だ。
// 大量の要素を連結する場合の定石
const items = Array.from({ length: 10000 }, (_, i) => `item-${i}`);
// 悪い例: += を使うと O(n^2) に近い負荷がかかる可能性がある
// 良い例: 配列に詰め込んで最後に一気に連結する
const result = items.join(”);
なぜ速いのか: `join` は内部で一度だけメモリを確保し、すべての文字列をコピーするため、メモリフラグメンテーション(断片化)が最小限に抑えられる。
—
3. シニアが教える「現場のベストプラクティス」
結局、どれを使うべきか?現場で迷わないための判断基準をまとめた。
| 手法 | 推奨シーン | メモ |
| :— | :— | :— |
| テンプレートリテラル | 日常的な連結、UIの動的生成 | 読みやすさ重視。まずはこれ。 |
| Array.join(”) | 大量データ(数千件以上)のループ処理 | メモリ効率を意識するならこれ。 |
| + 演算子 | 2〜3個の単純な連結 | 単純な処理なら最もオーバーヘッドが少ない。 |
現場で使える「最適化テンプレート」
もし君が大規模なデータをレンダリングする関数を書いているなら、以下のようなパターンをテンプレートとして持っておくといい。
/
- 大量データの文字列構築を効率的に行うユーティリティ例
/
function buildLargeList(data) {
// 配列をバッファとして利用する
const buffer = [];
for (let i = 0; i < data.length; i++) { // テンプレートリテラルで文字列を作り、配列に格納(ここでのメモリ確保は微小) buffer.push(`
`);
}
// 最後に一気に結合。これが最もメモリ効率が良い
return `
- ${buffer.join(”)}
`;
}
—
最後に:完璧を求めすぎない勇気
ここまで「パフォーマンス」について語ってきたが、一つだけ注意点がある。「時期尚早な最適化は悪である」という原則だ。
数件の文字列を連結するだけで `Array.join` を使うのは、コードの可読性を下げるだけの「自己満足な最適化」になりかねない。まずはテンプレートリテラルで美しく書き、ボトルネックが疑われる箇所(プロファイラで計測した結果、GCが暴れている箇所など)で初めて `Array.join` やバッファリングを検討する。
これが、伝説的なパフォーマンスを生み出すアーキテクトの冷静な立ち回りだ。コードは、動くこと以上に「次に読む誰かのために」書かれていることを忘れないでほしい。
さあ、エディタを開いて、君のコードの連結処理を見直してみよう。何か気づきがあれば、いつでも相談に来てくれ。

コメント