【JavaScript】文字列の追加・結合方法まとめ|先頭・末尾・padStart・join完全解説

【JavaScript】文字列の追加・結合方法まとめ|先頭・末尾・padStart・join完全解説 JavaScript

JavaScriptで文字列の先頭や末尾に別の文字列を追加する操作は、日常的に使う基本テクニックの一つです。単純な+演算子から、テンプレートリテラル、concat()padStart()/padEnd()Array.join()まで、目的に応じた方法が複数用意されています。

この記事では、文字列の先頭への追加末尾への追加ゼロ埋め複数文字列の結合を体系的に解説し、各メソッドの比較実務でよく使うパターンよくあるミスと注意点までカバーします。

この記事で学べること

  • +演算子・テンプレートリテラル・concat()先頭・末尾に文字列を追加する方法
  • padStart() / padEnd()ゼロ埋め・スペース埋めする方法
  • Array.join() / reduce()複数の文字列を効率的に結合する方法
  • 各メソッドの速度・可読性の比較表
  • URL組み立て・CSSクラス生成・桁埋めなど実務パターン
  • 数値+文字列の型変換、null/undefinedなどよくあるミス
スポンサーリンク

文字列の先頭に追加する方法

文字列の先頭に別の文字列を付け加えるには、追加したい文字列を左側に置いて結合します。ここでは3つの方法を紹介します。

+演算子(最もシンプル)

+演算子はJavaScriptで最も基本的な文字列結合の方法です。左側に追加したい文字列、右側に元の文字列を書くだけで、先頭に追加できます。

JavaScript
const original = 'world';
const result = 'Hello, ' + original;

console.log(result); // "Hello, world"

// 変数にプレフィックスを追加する例
const fileName = 'report.pdf';
const path = '/downloads/' + fileName;

console.log(path); // "/downloads/report.pdf"
実行結果
Hello, world
/downloads/report.pdf

ポイント: +演算子は直感的でわかりやすいため、単純な結合には最適です。ただし、変数が多くなると可読性が下がる場合があります。

テンプレートリテラル(バッククォート)

ES2015で追加されたテンプレートリテラル(バッククォート `)を使えば、${} の中に変数や式を埋め込んで文字列を組み立てられます。

JavaScript
const name = '太郎';
const greeting = `こんにちは、${name}さん!`;

console.log(greeting); // "こんにちは、太郎さん!"

// 先頭にプロトコルを追加
const domain = 'example.com';
const url = `https://${domain}/api/v1`;

console.log(url); // "https://example.com/api/v1"
実行結果
こんにちは、太郎さん!
https://example.com/api/v1

ポイント: テンプレートリテラルは複数の変数を埋め込む場合に特に可読性が高く、モダンJavaScriptでは最も推奨される方法です。

concat()メソッド

String.prototype.concat() は文字列を結合するメソッドです。先頭に追加したい文字列の concat() に元の文字列を渡します。

JavaScript
const original = 'JavaScript';

// 先頭に文字列を追加
const result = 'Learn '.concat(original);
console.log(result); // "Learn JavaScript"

// 複数の引数を渡せる
const full = 'Hello'.concat(', ', 'world', '!');
console.log(full); // "Hello, world!"
実行結果
Learn JavaScript
Hello, world!

注意: MDNではconcat()よりも+演算子やテンプレートリテラルの使用が推奨されています。concat()はパフォーマンスがやや劣る場合があるためです。

文字列の末尾に追加する方法

文字列の末尾に別の文字列を追加するのは、先頭への追加と並んで頻繁に行う操作です。

+演算子と +=代入演算子

+演算子で元の文字列の右側に追加するか、+=演算子で既存の変数に直接追記できます。

JavaScript
// +演算子で末尾に追加
const base = 'Hello';
const result = base + ', world!';
console.log(result); // "Hello, world!"

// +=演算子で追記(letが必要)
let message = 'エラーが発生しました';
message += ':ファイルが見つかりません';
console.log(message); // "エラーが発生しました:ファイルが見つかりません"

// +=で段階的に文字列を組み立てる
let html = '<ul>';
html += '<li>項目1</li>';
html += '<li>項目2</li>';
html += '</ul>';
console.log(html);
実行結果
Hello, world!
エラーが発生しました:ファイルが見つかりません
<ul><li>項目1</li><li>項目2</li></ul>

テンプレートリテラルで末尾に追加

テンプレートリテラルでも末尾追加は簡単です。変数の後ろに追加文字列を書きます。

JavaScript
const fileName = 'report';
const ext = '.pdf';

// 末尾に拡張子を追加
const fullName = `${fileName}${ext}`;
console.log(fullName); // "report.pdf"

// タイムスタンプを末尾に追加
const logEntry = '処理完了';
const timestamped = `${logEntry} [${new Date().toLocaleTimeString()}]`;
console.log(timestamped); // "処理完了 [14:30:00]"

concat()で末尾に追加

元の文字列のconcat()に追加したい文字列を渡します。

JavaScript
const str = 'Hello';

const result1 = str.concat(', world');
console.log(result1); // "Hello, world"

// 複数の文字列を一度に追加
const result2 = str.concat(', ', 'world', '!');
console.log(result2); // "Hello, world!"
実行結果
Hello, world
Hello, world!

padStart() / padEnd() でゼロ埋め・スペース埋め

ES2017で追加されたpadStart()padEnd()は、文字列が指定した長さに満たない場合に、先頭または末尾を指定文字で埋めるメソッドです。

基本構文

JavaScript
// padStart(目標の長さ, 埋める文字)
str.padStart(targetLength, padString)

// padEnd(目標の長さ, 埋める文字)
str.padEnd(targetLength, padString)

引数の説明:

  • targetLength: 結果の文字列の最小長さ。元の文字列がこの長さ以上なら何もしない
  • padString: 埋めるために使う文字列(省略するとスペース)

数値のゼロ埋め

ゼロ埋めはpadStart()の最も一般的な使い方です。

JavaScript
// 2桁のゼロ埋め
console.log('5'.padStart(2, '0'));  // "05"
console.log('12'.padStart(2, '0')); // "12"(すでに2桁なのでそのまま)

// 4桁のゼロ埋め(連番など)
console.log('1'.padStart(4, '0'));   // "0001"
console.log('42'.padStart(4, '0'));  // "0042"
console.log('999'.padStart(4, '0')); // "0999"

// 数値から文字列に変換してゼロ埋め
const num = 7;
const padded = String(num).padStart(3, '0');
console.log(padded); // "007"
実行結果
05
12
0001
0042
0999
007

日付フォーマット

月や日を2桁に揃える際にpadStart()が活躍します。

JavaScript
function formatDate(date) {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

console.log(formatDate(new Date(2026, 2, 5))); // "2026-03-05"
console.log(formatDate(new Date(2026, 11, 25))); // "2026-12-25"
実行結果
2026-03-05
2026-12-25

固定幅テキスト整形

padEnd()を使えば、テーブルのようなテキスト整形ができます。

JavaScript
const items = [
  { name: 'りんご', price: 150 },
  { name: 'バナナ', price: 100 },
  { name: 'ぶどう', price: 500 },
];

items.forEach(item => {
  const line = item.name.padEnd(10, ' ') + String(item.price).padStart(6, ' ') + '円';
  console.log(line);
});
実行結果
りんご          150円
バナナ          100円
ぶどう          500円

注意: padStart() / padEnd()文字列に対して動作します。数値に直接使うとエラーになるため、必ずString()で文字列に変換してから使いましょう。

複数の文字列を結合する方法

複数の文字列をまとめて結合する場合は、配列メソッドを活用すると効率的かつ可読性が高くなります。

Array.join()

join()は配列の要素を指定した区切り文字で結合し、一つの文字列にします。

JavaScript
// 基本的な使い方
const words = ['Hello', 'World', 'JavaScript'];
console.log(words.join(', ')); // "Hello, World, JavaScript"
console.log(words.join(' - ')); // "Hello - World - JavaScript"
console.log(words.join('')); // "HelloWorldJavaScript"

// 区切り文字を省略するとカンマで結合
console.log(words.join()); // "Hello,World,JavaScript"

// パンくずリストの生成
const breadcrumb = ['ホーム', 'JavaScript', '文字列操作'];
console.log(breadcrumb.join(' > ')); // "ホーム > JavaScript > 文字列操作"
実行結果
Hello, World, JavaScript
Hello - World - JavaScript
HelloWorldJavaScript
Hello,World,JavaScript
ホーム > JavaScript > 文字列操作

テンプレートリテラルで複数変数を埋め込む

変数が多い場合もテンプレートリテラルなら見やすく書けます。

JavaScript
const firstName = '太郎';
const lastName = '山田';
const age = 25;
const city = '東京';

// +演算子だと可読性が低い
const bad = lastName + ' ' + firstName + '(' + age + '歳・' + city + '在住)';

// テンプレートリテラルなら明快
const good = `${lastName} ${firstName}(${age}歳・${city}在住)`;

console.log(good); // "山田 太郎(25歳・東京在住)"
実行結果
山田 太郎(25歳・東京在住)

reduce()での結合

reduce()を使えば、配列の要素を変換しながら結合できます。

JavaScript
// 配列の要素を加工しながら結合
const tags = ['javascript', 'react', 'typescript'];

const hashTags = tags.reduce((acc, tag, i) => {
  return i === 0 ? `#${tag}` : `${acc} #${tag}`;
}, '');

console.log(hashTags); // "#javascript #react #typescript"

// よりシンプルに書くなら map + join
const hashTags2 = tags.map(tag => `#${tag}`).join(' ');
console.log(hashTags2); // "#javascript #react #typescript"
実行結果
#javascript #react #typescript
#javascript #react #typescript

ポイント: reduce()は柔軟ですが、単純な結合ならmap() + join()の方がシンプルで読みやすいです。変換と結合を同時に行いたい場合はmap() + join()を優先しましょう。

各メソッドの比較表

文字列の結合方法を速度・可読性・用途で比較します。

メソッド 速度 可読性 最適な用途
+ 演算子 高速 少数なら高い 2〜3個の単純な結合
テンプレートリテラル 高速 非常に高い 変数埋め込み・複雑な文
concat() やや遅い 普通 メソッドチェーン
+= 高速 ループ内で高い 段階的な文字列構築
join() 大量結合で最速 高い 配列要素の結合・大量データ
padStart() / padEnd() 高速 目的が明確 ゼロ埋め・固定幅整形

選び方の目安: 少数の結合にはテンプレートリテラル、配列の結合にはjoin()、ゼロ埋めにはpadStart()が最適です。迷ったらテンプレートリテラルを選びましょう。

実務でよく使うパターン

ここでは文字列の追加・結合が活躍する実務的なユースケースを紹介します。

URLパスの組み立て

JavaScript
// APIエンドポイントの組み立て
const BASE_URL = 'https://api.example.com';
const API_VERSION = 'v2';

function buildUrl(resource, id) {
  return `${BASE_URL}/${API_VERSION}/${resource}/${id}`;
}

console.log(buildUrl('users', 123));
// "https://api.example.com/v2/users/123"

// クエリパラメータの追加
function addQueryParams(url, params) {
  const query = Object.entries(params)
    .map(([key, val]) => `${key}=${encodeURIComponent(val)}`)
    .join('&');
  return `${url}?${query}`;
}

console.log(addQueryParams('/search', { q: 'JavaScript', page: 1 }));
// "/search?q=JavaScript&page=1"

CSSクラス名の動的生成

JavaScript
// 条件に応じてクラス名を組み立てる
function getClassName(isActive, isDisabled, size) {
  const classes = ['btn'];

  if (isActive)   classes.push('btn--active');
  if (isDisabled) classes.push('btn--disabled');
  if (size)       classes.push(`btn--${size}`);

  return classes.join(' ');
}

console.log(getClassName(true, false, 'large'));
// "btn btn--active btn--large"

console.log(getClassName(false, true, 'small'));
// "btn btn--disabled btn--small"

ファイルパスの構築

JavaScript
// パスの安全な結合
function joinPath(...segments) {
  return segments
    .map(seg => seg.replace(/^\/+|\/+$/g, ''))
    .filter(Boolean)
    .join('/');
}

console.log(joinPath('/home/', '/user/', 'documents/'));
// "home/user/documents"

// タイムスタンプ付きファイル名
function makeFileName(baseName, ext) {
  const timestamp = Date.now();
  return `${baseName}_${timestamp}.${ext}`;
}

console.log(makeFileName('backup', 'sql'));
// "backup_1710064800000.sql"

数値の桁埋め(連番生成)

JavaScript
// 連番IDの生成(0001, 0002, ...)
function generateIds(prefix, count, digits = 4) {
  return Array.from({ length: count }, (_, i) => {
    return prefix + String(i + 1).padStart(digits, '0');
  });
}

const ids = generateIds('TASK-', 5);
console.log(ids);
// ["TASK-0001", "TASK-0002", "TASK-0003", "TASK-0004", "TASK-0005"]
実行結果
["TASK-0001", "TASK-0002", "TASK-0003", "TASK-0004", "TASK-0005"]

HTMLの動的生成

JavaScript
// テーブルHTMLの生成
const users = [
  { name: '山田太郎', email: 'taro@example.com' },
  { name: '鈴木花子', email: 'hanako@example.com' },
];

const rows = users.map(user => 
  `<tr><td>${user.name}</td><td>${user.email}</td></tr>`
).join('\n');

const table = `<table>
  <thead><tr><th>名前</th><th>メール</th></tr></thead>
  <tbody>${rows}</tbody>
</table>`;

console.log(table);

よくあるミスと注意点

文字列の結合では、思わぬバグが発生しやすいポイントがいくつかあります。

数値 + 文字列 の型変換

JavaScriptでは+演算子でオペランドの一方が文字列の場合、もう一方も文字列に変換されて結合されます。これは意図しない結果を生みやすいバグの原因です。

JavaScript
// 意図しない文字列結合
console.log('5' + 3);     // "53"(文字列結合!)
console.log(5 + '3');     // "53"(文字列結合!)
console.log(5 + 3);       // 8(数値加算)

// フォーム入力値でよくあるミス
const price = '1000';    // inputから取得した値は文字列
const tax = 100;
console.log(price + tax); // "1000100"(文字列結合!)

// 正しい方法:Number()で変換してから計算
console.log(Number(price) + tax); // 1100(数値加算)
実行結果
53
53
8
1000100
1100

注意: フォーム入力値やAPIレスポンスの値は文字列であることが多いです。数値計算を行う前に必ずNumber()parseInt()で型変換しましょう。

nullやundefinedとの結合

nullundefinedを文字列と結合すると、そのまま文字列"null""undefined"として結合されます。

JavaScript
// null / undefined の問題
let value = null;
console.log('値は: ' + value);     // "値は: null"

let name;
console.log('名前: ' + name);     // "名前: undefined"

// テンプレートリテラルでも同じ問題が起きる
console.log(`値は: ${value}`);    // "値は: null"

// 対策1: Null合体演算子(??)でデフォルト値
console.log(`値は: ${value ?? '未設定'}`); // "値は: 未設定"

// 対策2: 論理OR演算子(||)でデフォルト値
console.log(`名前: ${name || '匿名'}`); // "名前: 匿名"

// 対策3: 配列のfilterでnull/undefinedを除外して結合
const parts = ['東京都', null, '渋谷区', undefined, '1-1-1'];
const address = parts.filter(Boolean).join('');
console.log(address); // "東京都渋谷区1-1-1"
実行結果
値は: null
名前: undefined
値は: null
値は: 未設定
名前: 匿名
東京都渋谷区1-1-1

パフォーマンス: 大量結合ではjoin()を使う

ループ内で+=を使った大量の文字列結合は、毎回新しい文字列が生成されるためパフォーマンスが低下する場合があります。大量の結合にはjoin()が効率的です。

JavaScript
// 非推奨: ループ内で += を使う
let result = '';
for (let i = 0; i < 10000; i++) {
  result += `item${i}, `;
}

// 推奨: 配列に集めてからjoin()で結合
const items = [];
for (let i = 0; i < 10000; i++) {
  items.push(`item${i}`);
}
const result2 = items.join(', ');

// さらに簡潔に: Array.from + join
const result3 = Array.from(
  { length: 10000 },
  (_, i) => `item${i}`
).join(', ');

ポイント: モダンなJSエンジンでは+=も最適化されていますが、数万件以上の結合ではjoin()の方が安定して高速です。コードの意図も明確になるため、配列がある場合はjoin()を優先しましょう。

よくある質問(FAQ)

Q. 文字列の先頭または末尾に文字を追加するシンプルな方法は?
A. 先頭に追加:"prefix" + strまたはテンプレートリテラル`prefix${str}`。末尾に追加:str + "suffix"。ES2017のpadStart()/padEnd()は指定長さになるまでパディングを追加します(例:"5".padStart(3, "0")→”005″)。
Q. 文字列から特定の部分を削除するにはどうすればよいですか?
A. str.replace("削除したい文字", "")で最初の一致箇所を削除。全箇所を削除するにはstr.replaceAll("削除", "")またはstr.replace(/削除/g, "")。前後の空白を削除するにはtrim()。特定インデックスの文字を削除するにはstr.slice(0, i) + str.slice(i+1)で対象文字を切り出して結合します。
Q. 配列に格納した文字列を結合するにはjoin()とreduce()どちらがよいですか?
A. 配列の文字列を結合するにはarr.join("")(区切りなし)やarr.join(", ")(カンマ区切り)が最も読みやすくパフォーマンスも良好です。reduce()は汎用的ですが、単純な結合にはjoin()が適切です。大量の文字列を逐次追加する場合もjoin()が+=による累積より効率的です。

まとめ

JavaScriptで文字列を追加・結合する方法を体系的に解説しました。最後に、メソッド選択ガイドとして用途ごとの最適な方法をまとめます。

やりたいこと おすすめの方法 コード例
先頭に追加 テンプレートリテラル / + `prefix${str}`
末尾に追加 テンプレートリテラル / += `${str}suffix`
ゼロ埋め・桁揃え padStart() / padEnd() str.padStart(4, '0')
配列を結合 join() arr.join(', ')
変数を埋め込む テンプレートリテラル `${a} and ${b}`
大量データの結合 Array + join() items.join('\n')

まとめのポイント

  • 迷ったらテンプレートリテラル: 可読性が高く、モダンJavaScriptの標準的な方法
  • ゼロ埋めにはpadStart(): 日付フォーマットや連番生成に最適
  • 配列の結合にはjoin(): 区切り文字を指定した効率的な結合
  • 型変換に注意: +演算子は文字列と数値で挙動が変わる
  • null/undefinedの対策: ??演算子やfilter(Boolean)でガード
  • 大量結合はjoin(): パフォーマンスと可読性の両面で有利