【JavaScript】trim の使い方|文字列の空白を除去・trimStart / trimEnd・全角スペース対応・フォーム入力の正規化まで解説

フォーム入力の前後に入った不要なスペース、API レスポンスに含まれる改行やタブ文字など、文字列の先頭・末尾の空白を除去する操作は日常的に必要です。JavaScript の trim メソッドを使えば 1 行で実現できます。

この記事でわかること
・trim で先頭と末尾の空白を同時に除去する方法
・trimStart(先頭のみ)/ trimEnd(末尾のみ)の使い方
・trim が除去する空白文字の一覧
・全角スペース(U+3000)の扱い
・ゼロ幅スペースなど特殊な空白の除去方法
・文字列内部の連続スペースを 1 つにまとめる方法
・フォーム入力の正規化・メールアドレスのクリーニングの実務パターン
スポンサーリンク

trim の基本

構文
const result = str.trim();
// 戻り値: 先頭と末尾の空白を除去した新しい文字列
// 元の文字列は変更されない
基本例
const str = "   Hello World   ";

console.log(str.trim());      // "Hello World"
console.log(str);             // "   Hello World   "(元は変わらない)

// タブ・改行も除去される
console.log("\t\n Hello \n\t".trim()); // "Hello"
trim は先頭と末尾の空白のみを除去します。文字列内部のスペースは除去されません"Hello World".trim()"Hello World" のままです。

trimStart / trimEnd で片側だけ除去する

メソッド 除去する位置 別名
trim() 先頭 + 末尾
trimStart() 先頭のみ trimLeft()
trimEnd() 末尾のみ trimRight()
JavaScript
const str = "   Hello   ";

console.log(str.trimStart()); // "Hello   "(先頭のみ除去)
console.log(str.trimEnd());   // "   Hello"(末尾のみ除去)
console.log(str.trim());      // "Hello"(両端除去)
trimLeft / trimRighttrimStart / trimEnd の別名(エイリアス)です。ECMAScript 2019 で trimStart / trimEnd が正式名称として策定されたため、新しいコードではこちらを使いましょう。

trim が除去する空白文字の一覧

trim は半角スペースだけでなく、以下のすべての空白文字を除去します。

文字 Unicode 説明
半角スペース U+0020 最も一般的な空白
タブ U+0009 \t
改行(LF) U+000A \n
復帰(CR) U+000D \r
垂直タブ U+000B \v
フォームフィード U+000C \f
ノーブレークスペース U+00A0  
全角スペース U+3000 日本語入力でよく混入
BOM U+FEFF バイトオーダーマーク
全角スペースの除去を確認
const str = "\u3000Hello\u3000";
console.log(str.trim()); // "Hello"(全角スペースも除去される)
ECMAScript 2015 以降の仕様では全角スペース(U+3000)も trim の対象です。モダンブラウザ(Chrome・Firefox・Safari・Edge)ではすべて除去されます。

trim では除去されない特殊な文字

以下の文字は Unicode の空白文字カテゴリに含まれないため、trim では除去されません

文字 Unicode 説明
ゼロ幅スペース U+200B 見えないがコピペで混入しやすい
ゼロ幅非結合子 U+200C ZWNJ
ゼロ幅結合子 U+200D ZWJ(絵文字結合にも使用)
ソフトハイフン U+00AD 改行可能位置を示す
ゼロ幅スペースを含む場合
const str = "\u200BHello\u200B";

console.log(str.trim());        // "\u200BHello\u200B"(除去されない)
console.log(str.trim().length); // 7(見た目5文字だが7文字)

// 正規表現で除去
const cleaned = str.replace(/[\u200B-\u200D\uFEFF]/g, "").trim();
console.log(cleaned);        // "Hello"
console.log(cleaned.length); // 5
Web ページからのコピペやリッチテキストエディタの出力には、ゼロ幅スペースが混入していることがあります。バリデーションで「空文字なのに length が 0 にならない」場合は、ゼロ幅文字の混入を疑ってください。

文字列内部のスペースを処理する

trim は先頭・末尾のみ対象なので、文字列内部のスペース処理には別の方法を使います。

連続スペースを 1 つにまとめる

JavaScript
const str = "Hello    World   JavaScript";

const normalized = str.replace(/\s+/g, " ").trim();
console.log(normalized); // "Hello World JavaScript"

すべてのスペースを除去する

JavaScript
const str = " H e l l o ";

console.log(str.replace(/\s/g, "")); // "Hello"

全角スペースも含めてすべて半角スペースに統一する

JavaScript
const str = "Hello\u3000World\u3000JavaScript";

const unified = str.replace(/[\s\u3000]+/g, " ").trim();
console.log(unified); // "Hello World JavaScript"

実務でよく使うパターン

フォーム入力のバリデーション前処理

JavaScript
const form = document.getElementById("myForm");

form.addEventListener("submit", (e) => {
  e.preventDefault();

  const name = form.querySelector("[name=username]").value.trim();
  const email = form.querySelector("[name=email]").value.trim().toLowerCase();

  if (!name) {
    alert("名前を入力してください");
    return;
  }

  // trim 済みの値でバリデーション・送信
  console.log({ name, email });
});

空白のみの入力を「空」として判定する

JavaScript
function isBlank(str) {
  return !str?.trim();
}

console.log(isBlank(""));       // true
console.log(isBlank("   "));    // true(スペースのみ)
console.log(isBlank("\t\n"));   // true(タブ+改行のみ)
console.log(isBlank(null));     // true
console.log(isBlank("Hello"));  // false

CSV 値のクリーニング

JavaScript
const csvRow = " apple , banana , cherry ";

// 分割して各要素を trim
const items = csvRow.split(",").map(item => item.trim());
console.log(items); // ["apple", "banana", "cherry"]

複数行テキストの各行を trim する

JavaScript
const text = "  line1  \n  line2  \n  line3  ";

const trimmedLines = text
  .split("\n")
  .map(line => line.trim())
  .filter(Boolean)  // 空行を除去
  .join("\n");

console.log(trimmedLines);
// "line1\nline2\nline3"

検索キーワードの正規化

JavaScript
function normalizeSearchQuery(query) {
  return query
    .trim()                    // 前後の空白を除去
    .replace(/\s+/g, " ")     // 連続スペースを1つに
    .toLowerCase();            // 小文字に統一
}

console.log(normalizeSearchQuery("  JavaScript   Tutorial  "));
// "javascript tutorial"

関連記事

よくある質問

Qtrim は全角スペースも除去しますか?
Aはい。ECMAScript 2015 以降の仕様では全角スペース(U+3000)も trim の対象です。モダンブラウザではすべて正しく除去されます。
QtrimStart と trimLeft の違いは何ですか?
A同じメソッドです。trimLeft は非標準の別名で、trimStart が ECMAScript 2019 で策定された正式名称です。新しいコードでは trimStart / trimEnd を使いましょう。
Qtrim しても空文字にならない見えない文字があります。
Aゼロ幅スペース(U+200B)やソフトハイフン(U+00AD)など、Unicode の空白カテゴリに含まれない文字は trim で除去されません。str.replace(/[\u200B-\u200D\uFEFF]/g, "") で別途除去してください。
Qパスワード入力に trim を適用すべきですか?
Aパスワードの前後にスペースを意図的に含めるユーザーもいるため、パスワードにはtrim を適用しないのが一般的です。ユーザー名やメールアドレスなど、空白が意味を持たないフィールドでは trim を適用しましょう。
Q文字列内部の連続スペースを trim で除去できますか?
Aできません。trim は先頭と末尾の空白のみ対象です。内部の連続スペースを 1 つにまとめるには str.replace(/\s+/g, " ").trim() を使ってください。

まとめ

trim は文字列の先頭と末尾の空白を除去するシンプルなメソッドです。

  • 基本: str.trim() で両端の空白を除去
  • 片側のみ: trimStart()(先頭)/ trimEnd()(末尾)
  • 除去対象: 半角スペース・タブ・改行・全角スペースなどすべての空白文字
  • 除去されない文字: ゼロ幅スペース(U+200B)など → 正規表現で別途対応
  • 内部のスペース: replace(/\s+/g, " ").trim() で連続スペースを統一

フォーム入力のバリデーション前に trim するのは基本中の基本です。検索クエリの正規化や CSV のクリーニングなど、文字列処理の前処理として日常的に使うメソッドなので、trimStart / trimEnd も含めてしっかり使いこなしましょう。