文字列補間
テンプレートリテラルなどで変数や式の値を文字列に埋め込む処理。
文字列補間 (String Interpolation) とは、文字列リテラルの中に変数や式の値を埋め込む機能です。文字列結合 (+ 演算子による連結) よりも可読性が高く、2026 年時点の主要なプログラミング言語はいずれも何らかの補間構文を備えています。動的なメッセージの生成、テンプレートエンジンの基盤、ログ出力のフォーマットなど、テキストを動的に構築するあらゆる場面で活用されます。
JavaScript ではテンプレートリテラル (`Hello, ${name}!`) を使って文字列補間を行います。バッククォートで囲み、${} 内に任意の式を記述できます。単純な変数参照だけでなく、関数呼び出しや三項演算子、算術演算なども埋め込めるため、複雑な文字列の組み立てが 1 行で完結します。さらにタグ付きテンプレートリテラルを使えば、埋め込み値に対してカスタム処理 (HTML エスケープや国際化など) を適用することも可能です。
Python では f-string (f"Hello, {name}!") が Python 3.6 以降の標準的な補間手法です。それ以前は str.format() や % 演算子が使われていました。Python 3.12 で f-string の文法制限が緩和され、外側と同じ引用符を式の中で使ったり、式の中にバックスラッシュを含めたりできるようになっています。Ruby では "Hello, #{name}!"、C# では $"Hello, {name}!"、Kotlin では "Hello, $name!" と、言語ごとに構文は異なりますが、変数を文字列内に直接埋め込むという概念は共通しています。Swift の "\(variable)" や PHP の "$variable" も同様の機能を提供します。
文字列補間と文字列結合の使い分けは、コードの可読性と保守性に直結します。たとえば "名前: " + firstName + " " + lastName + " (年齢: " + age + ")" という結合は、`名前: ${firstName} ${lastName} (年齢: ${age})` と補間で書いた方が意図が明確です。ただし多言語対応 (i18n) では話が逆になります。テンプレートリテラルは埋め込み位置がコード側に固定されるため、語順が異なる言語に合わせて差し替えることができません。言語ごとに語順が変わる文を扱うには、翻訳カタログ側に名前付きまたは番号付きのプレースホルダーを持つ書式指定型 (Python の str.format() や ICU MessageFormat など) を使い、実行時に値を差し込む必要があります。"{name} は {city} に住んでいます" と "{name} lives in {city}" のように、同じ引数で語順の違う訳文を用意できるのがこの方式の利点です。補間構文は 1 箇所で完結するメッセージ、書式指定型は翻訳が必要なメッセージ、と使い分けます。
文字列補間はセキュリティ上の注意も必要です。ユーザー入力をそのまま補間すると SQL インジェクションや XSS の原因になるため、適切なエスケープ処理やパラメータ化クエリの使用が不可欠です。テンプレートエンジン (EJS、Jinja2、Handlebars など) は自動エスケープ機能を備えていることが多いですが、raw や safe フィルターの誤用には注意が必要です。
文字数カウントの観点では、補間後の文字列の長さは埋め込まれた値の文字数に依存します。数値を補間する場合、toString() の結果の桁数がそのまま文字数に反映されます。たとえば ${price} に 1000 が入れば 4 文字、100000 なら 6 文字となり、固定長のフォーマットが必要な場面では padStart() や toFixed() との組み合わせが有効です。
補間される値が期待どおりの桁数にならない場合もあり、文字数上限を守る設計ではこれが落とし穴になります。JavaScript の場合、二進浮動小数の誤差で 0.1 + 0.2 は 0.30000000000000004 の 19 文字になります。1e21 以上の数値は指数表記に切り替わり、1e+21 の 5 文字になる一方で 1e20 は 21 文字のままです。undefined や null は空文字ではなく undefined の 9 文字、null の 4 文字として埋め込まれ、オブジェクトをそのまま渡すと [object Object] の 15 文字になります。API のフィールド長やデータベースの列幅、入力欄の上限を守る必要がある場面では、補間の前に toFixed() や toLocaleString()、既定値の明示で表記を確定させ、長さの判定は補間後の文字列に対して行います。