JavaScript で文字列を結合する方法は複数あります。+ 演算子、テンプレートリテラル、concat()、Array.join() など、場面に応じて使い分けることでコードの可読性とパフォーマンスが向上します。
本記事では、各方法の書き方と違い、数値との結合時の型変換、テンプレートリテラルの活用、大量結合時のパフォーマンスまで解説します。
この記事でわかること
・+ 演算子による文字列結合の基本
・テンプレートリテラル(バッククォート ` `)で変数を埋め込む方法
・concat() メソッドの使い方
・Array.join() で配列を任意の区切り文字で結合する方法
・+= で文字列を追記する方法
・数値 + 文字列の型変換の罠
・複数行文字列の作成
・各方法の使い分け早見表
・+ 演算子による文字列結合の基本
・テンプレートリテラル(バッククォート ` `)で変数を埋め込む方法
・concat() メソッドの使い方
・Array.join() で配列を任意の区切り文字で結合する方法
・+= で文字列を追記する方法
・数値 + 文字列の型変換の罠
・複数行文字列の作成
・各方法の使い分け早見表
+ 演算子で結合する(基本)
JavaScript(+ 演算子)
// 基本的な文字列結合 const firstName = "Taro"; const lastName = "Yamada"; const fullName = lastName + " " + firstName; console.log(fullName); // "Yamada Taro" // 変数と固定文字列の結合 const greeting = "Hello, " + firstName + "!"; console.log(greeting); // "Hello, Taro!" // 複数の + で連結 const message = "名前: " + lastName + " " + firstName + " さん"; console.log(message); // "名前: Yamada Taro さん"
+ 演算子は数値と文字列で挙動が変わる
"3" + 5 は "35"(文字列結合)、3 + 5 は 8(数値加算)になります。意図しない結合を防ぐため、次のセクションで型変換の注意点を解説します。数値 + 文字列の型変換の罠
JavaScript(型変換の例)
// 文字列 + 数値 → 文字列結合(数値が文字列に変換される)
console.log("年齢: " + 25); // "年齢: 25"
console.log("3" + 5); // "35"(文字列結合)
console.log(3 + 5 + " 円"); // "8 円"(先に 3+5=8 を計算)
console.log("合計: " + 3 + 5); // "合計: 35"(左から順に文字列結合)
// 意図通りにするには括弧で計算を先に行う
console.log("合計: " + (3 + 5)); // "合計: 8"
// null / undefined との結合
console.log("値: " + null); // "値: null"
console.log("値: " + undefined); // "値: undefined"
// boolean との結合
console.log("結果: " + true); // "結果: true"
| 式 | 結果 | 理由 |
|---|---|---|
| “3” + 5 | “35” | 左辺が文字列 → 5 を文字列に変換して結合 |
| 3 + 5 + ” 円” | “8 円” | 先に 3+5=8(数値)→ 8+” 円” で文字列結合 |
| “合計: ” + 3 + 5 | “合計: 35” | “合計: “+3=”合計: 3” → “合計: 3″+5=”合計: 35” |
| “合計: ” + (3 + 5) | “合計: 8” | 括弧内を先に計算 → 文字列結合 |
「左から順に評価される」ルールを覚える
+ は左から右へ順番に評価されます。左辺が文字列なら以降は全て文字列結合になります。数値計算を先に行いたい場合は括弧で囲むか、テンプレートリテラルを使ってください。テンプレートリテラルで結合する(推奨)
JavaScript(テンプレートリテラル)
// バッククォート ` ` と ${} で変数を埋め込み
const name = "Taro";
const age = 25;
const message = `Hello, ${name}! You are ${age} years old.`;
console.log(message);
// "Hello, Taro! You are 25 years old."
// 式も埋め込み可能
console.log(`合計: ${3 + 5} 円`); // "合計: 8 円"
console.log(`税込: ${1000 * 1.1} 円`); // "税込: 1100 円"
console.log(`大文字: ${name.toUpperCase()}`); // "大文字: TARO"
// 三項演算子の埋め込み
const status = true;
console.log(`状態: ${status ? "有効" : "無効"}`); // "状態: 有効"
テンプレートリテラルで複数行文字列を作成
JavaScript(複数行)
// バッククォートなら改行がそのまま含まれる
const html = `
<div class="card">
<h2>${title}</h2>
<p>${description}</p>
</div>
`;
// + 演算子で書くと冗長
const html2 = '<div class="card">\n' +
' <h2>' + title + '</h2>\n' +
' <p>' + description + '</p>\n' +
'</div>';
テンプレートリテラルが最も推奨
・
・
・改行がそのまま含まれる(
・型変換の罠がない(
ES2015 以降のコードではテンプレートリテラルを標準として使ってください。
・
+ 演算子より可読性が高い(クォートの開閉が不要)・
${式} で変数も計算式も三項演算子も埋め込める・改行がそのまま含まれる(
\n 不要)・型変換の罠がない(
${3 + 5} は先に計算される)ES2015 以降のコードではテンプレートリテラルを標準として使ってください。
concat() メソッドで結合する
JavaScript(concat)
// 文字列の concat メソッド
const str1 = "Hello";
const str2 = "World";
const result = str1.concat(", ", str2, "!");
console.log(result); // "Hello, World!"
// 実務では + やテンプレートリテラルの方がシンプル
// concat は使う場面がほとんどない
concat() は機能的には + と同じですが、冗長になるため実務ではほとんど使われません。テンプレートリテラルか + を使ってください。
Array.join() で配列を結合する
JavaScript(join: 配列から文字列へ)
// 配列の要素を区切り文字で結合
const parts = ["2026", "03", "30"];
console.log(parts.join("-")); // "2026-03-30"
console.log(parts.join("/")); // "2026/03/30"
console.log(parts.join("")); // "20260330"(区切りなし)
console.log(parts.join(", ")); // "2026, 03, 30"
// デフォルトの区切り文字はカンマ
console.log(parts.join()); // "2026,03,30"
// HTML のリストを生成
const items = ["りんご", "バナナ", "みかん"];
const listHtml = "<ul><li>" + items.join("</li><li>") + "</li></ul>";
console.log(listHtml);
// "<ul><li>りんご</li><li>バナナ</li><li>みかん</li></ul>"
join() は「配列 → 文字列」の変換に最適
パスの構築(
パスの構築(
["a","b","c"].join("/"))、CSV の生成(data.join(","))、HTML の構築など、配列の要素を区切り文字で連結する場合に使います。+= で文字列を追記する
JavaScript(+= による追記)
let message = "Hello";
message += ", ";
message += "World";
message += "!";
console.log(message); // "Hello, World!"
// ループ内で文字列を構築
const items = ["A", "B", "C"];
let result = "";
for (const item of items) {
result += `<li>${item}</li>`;
}
console.log(`<ul>${result}</ul>`);
// "<ul><li>A</li><li>B</li><li>C</li></ul>"
// ↑ join() で書くとよりシンプル
const result2 = "<ul>" + items.map(i => `<li>${i}</li>`).join("") + "</ul>";
各方法の比較と使い分け
| 方法 | 書き方 | 用途 | 推奨度 |
|---|---|---|---|
| テンプレートリテラル | `Hello, ${name}!` | 変数を含む文字列の構築(最も推奨) | 最も推奨 |
| + 演算子 | “Hello, ” + name + “!” | シンプルな結合 | 推奨 |
| join() | arr.join(“-“) | 配列の要素を区切り文字で結合 | 配列に最適 |
| += 演算子 | str += “追記” | ループで文字列を構築 | 可(join/map が使えないとき) |
| concat() | str.concat(“a”, “b”) | (ほぼ使わない) | 非推奨 |
迷ったらテンプレートリテラルを使う
変数が 1 つでも含まれるならテンプレートリテラル、配列の結合ならjoin()、それ以外のシンプルな結合なら+ 演算子。
変数が 1 つでも含まれるならテンプレートリテラル、配列の結合ならjoin()、それ以外のシンプルな結合なら+ 演算子。
concat() は実務で使う場面がほとんどないため覚えなくても問題ありません。タグ付きテンプレートリテラル(発展)
JavaScript(タグ付きテンプレート: XSS 対策の例)
// HTML エスケープ用のタグ関数
function safeHtml(strings, ...values) {
return strings.reduce((result, str, i) => {
const val = values[i - 1];
// 変数部分を HTML エスケープ
const escaped = String(val)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """);
return result + escaped + str;
});
}
// ユーザー入力を安全に埋め込み
const userInput = '<script>alert("XSS")</script>';
const html = safeHtml`<p>コメント: ${userInput}</p>`;
console.log(html);
// "<p>コメント: <script>alert("XSS")</script></p>"
タグ付きテンプレートリテラルは、テンプレートリテラルの前に関数名を付けることで、文字列と変数を分離して処理できる仕組みです。XSS 対策、SQL クエリのパラメータ化、国際化(i18n)などに活用されます。
実務パターン集
パターン(1): URL の構築
JavaScript
const baseUrl = "https://api.example.com";
const endpoint = "/users";
const id = 42;
// テンプレートリテラル
const url = `${baseUrl}${endpoint}/${id}`;
console.log(url); // "https://api.example.com/users/42"
// クエリパラメータの構築は URLSearchParams を使う方が安全
const params = new URLSearchParams({ page: 1, limit: 20 });
const urlWithQuery = `${baseUrl}${endpoint}?${params}`;
console.log(urlWithQuery); // "https://api.example.com/users?page=1&limit=20"
パターン(2): ログメッセージの構築
JavaScript
function log(level, message, data) {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] [${level}] ${message}`, data ?? "");
}
log("INFO", "ユーザーがログインしました", { userId: 42 });
// "[2026-03-30T05:00:00.000Z] [INFO] ユーザーがログインしました" { userId: 42 }
パターン(3): CSV 行の生成
JavaScript
// 配列から CSV の 1 行を生成
const row = ["Tanaka", 30, "tokyo@example.com"];
const csvLine = row.join(",");
console.log(csvLine); // "Tanaka,30,tokyo@example.com"
// ヘッダー付き CSV
const headers = ["名前", "年齢", "メール"];
const data = [
["Tanaka", 30, "tanaka@example.com"],
["Suzuki", 25, "suzuki@example.com"],
];
const csv = [headers, ...data].map(row => row.join(",")).join("\n");
console.log(csv);
パターン(4): パンくずリストの生成
JavaScript
const breadcrumbs = ["ホーム", "カテゴリ", "商品詳細"];
const breadcrumbHtml = breadcrumbs
.map((item, i) => i < breadcrumbs.length - 1
? `<a href="#">${item}</a>`
: `<span>${item}</span>`
)
.join(" > ");
console.log(breadcrumbHtml);
// "<a href=\"#\">ホーム</a> > <a href=\"#\">カテゴリ</a> > <span>商品詳細</span>"
パフォーマンスの注意点
| 方法 | 大量結合の速度 | 備考 |
|---|---|---|
| + / += (ループ内) | 遅い場合あり(古いエンジン) | 現代のエンジンでは最適化されるため差はほぼない |
| Array.push + join | 最速パターン | 大量(数万件)の結合では push + join が安定して高速 |
| テンプレートリテラル | + とほぼ同等 | 可読性が高く推奨 |
JavaScript(大量結合: push + join パターン)
// 大量の文字列を結合する場合
const parts = [];
for (let i = 0; i < 100000; i++) {
parts.push(`<li>Item ${i}</li>`);
}
const html = parts.join("");
// += でループするより配列に push して最後に join する方が安定して高速
通常の用途ではパフォーマンスを気にする必要はない
数十〜数百回程度の結合では、どの方法でも速度差は体感できません。数万回以上のループ内結合で速度が問題になる場合のみ、
数十〜数百回程度の結合では、どの方法でも速度差は体感できません。数万回以上のループ内結合で速度が問題になる場合のみ、
Array.push + join パターンを検討してください。よくある質問
Qテンプレートリテラルと通常の文字列結合はどちらが速いですか?
Aパフォーマンスはほぼ同等です。現代の JavaScript エンジンではどちらも十分に最適化されています。速度ではなく可読性で選んでください。変数を含む結合ならテンプレートリテラルが推奨です。
Q数値を文字列に変換してから結合すべきですか?
A
+ 演算子やテンプレートリテラルは数値を自動的に文字列に変換するため、明示的な変換は通常不要です。ただし "3" + 5 = "35" のような意図しない結合を防ぐため、テンプレートリテラルの ${3 + 5} を使う方が安全です。Qnull や undefined と結合するとどうなりますか?
A
"Hello " + null は "Hello null"(文字列 “null”)になります。テンプレートリテラルでも同様に null が文字列として埋め込まれます。null / undefined をチェックしたい場合は ${value ?? "デフォルト"}(Nullish coalescing)を使ってください。Qバッククォート(`)はどのキーで入力しますか?
A日本語キーボードでは
Shift + @(@ キーの上)で入力できます。US キーボードでは左上の ~ キー(Shift なし)です。Qテンプレートリテラル内でバッククォートを使いたい場合は?
Aバックスラッシュでエスケープします。
`バッククォート: \`` → "バッククォート: `"Qjoin() の引数を省略するとどうなりますか?
Aデフォルトの区切り文字はカンマ(,)です。
["a","b","c"].join() は "a,b,c" になります。区切りなしで結合したい場合は join("")(空文字列)を明示してください。まとめ
文字列結合の要点をまとめます。
| やりたいこと | 推奨方法 |
|---|---|
| 変数を含む文字列の構築 | テンプレートリテラル: `Hello, ${name}!` |
| シンプルな結合 | + 演算子: “Hello” + ” ” + “World” |
| 配列を区切り文字で結合 | join(): [“a”,”b”,”c”].join(“-“) |
| ループ内で文字列を構築 | Array.push + join(大量時)/ += (少量時) |
| 複数行文字列 | テンプレートリテラル(バッククォートで改行がそのまま含まれる) |
| HTML の安全な構築 | タグ付きテンプレートリテラル / textContent |
| 数値計算を含む文字列 | `合計: ${3 + 5} 円`(括弧不要) |

