---
type: reference
language: javascript
slug: string/trim-pad
title: "trim() / padStart() / padEnd() / repeat()"
title_tag: "JavaScript の trim() と padStart() — 空白除去と桁揃え"
summary: >
  前後の空白を落とす trim()、桁を揃える padStart() / padEnd()、繰り返す repeat()。
  全角空白も落ちること、長すぎると詰めないこと、日本語で桁が揃わない理由まで実行して確かめます。
description: >
  trim() は全角空白やタブも落とします。padStart() は元が長いと何もしません。
  日本語で桁が揃わない理由まで、実行しながら確かめられます。
status: published
difficulty: 1
minutes: 6

versions:
  verified: "Node 22.22.3"
  since: "ES2017"
  deprecated: null
  removed: null

sources:
  - title: "String.prototype.trim — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-string.prototype.trim"
  - title: "String.prototype.padStart — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-string.prototype.padstart"
  - title: "String.prototype.padStart() — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart"

terms: [空白, 桁揃え, 非破壊]

links:
  related:
    - javascript/learn/string/basics
    - javascript/how-to/string/truncate
    - javascript/reference/string/split

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

どれも[em:元の文字列は変えません]。**新しい文字列が返ります。**

## `trim()` — 前後の空白を落とす

```js run
const input = '  あ  ';

console.log(JSON.stringify(input.trim()));
console.log(JSON.stringify(input.trimStart()));
console.log(JSON.stringify(input.trimEnd()));
```
```output
"あ"
"あ  "
"  あ"
```

落ちるのは[key:前後だけ]です。真ん中は残ります。

```js run
console.log(JSON.stringify('\ta\n b　'.trim()));
```
```output
"a\n b"
```

**タブも改行も全角空白も落ちます。**
ですが、真ん中の改行と半角空白はそのままです。

[dim:仕様では「空白類」と「行終端子」の両方が対象です。全角空白 U+3000 も空白類に含まれます。]

入力を受け取ったら、まず `trim()` してから比べてください。

```js run
const typed = ' はい ';

console.log(typed === 'はい');
console.log(typed.trim() === 'はい');
```
```output
false
true
```

**見た目が同じでも一致しません。** 問い合わせ画面の照合でよく起きます。

## `padStart()` / `padEnd()` — 桁を揃える

```js run
console.log('5'.padStart(3, '0'));
console.log('5'.padEnd(3, '0'));
console.log('ab'.padStart(5, 'xy'));
```
```output
005
500
xyxab
```

第1引数は[key:足す数ではなく、仕上がりの長さ]です。
埋める文字は繰り返され、**溢れた分は切られます。**

### 元が長いと何もしない

```js bad
console.log('12345'.padStart(3, '0'));
console.log('12345'.padStart(3, '0').length);
```
```output
12345
5
```

**切り詰めてはくれません。** 長さを必ず揃えたいなら、
`slice()` と組み合わせてください。
→ [文字列を決まった文字数で切り詰める](/ja/javascript/how-to/string/truncate/)

### 第2引数を省くと半角空白

```js run
console.log(JSON.stringify('a'.padStart(3)));
```
```output
"  a"
```

## 日本語では桁が揃わない

```js bad
console.log('あ'.padStart(3, '0'));
console.log('5'.padStart(3, '0'));
```
```output
00あ
005
```

**どちらも3文字です。** ですが、等幅の表示でも `あ` は2文字分の幅を取ります。
[bad:見た目の桁は揃いません。]

見た目で揃えたいなら、文字数ではなく[key:表示幅]で数える必要があります。
数える単位そのものにも注意が要ります。
→ [文字を正しく数える](/ja/javascript/learn/string/unicode/)

## `repeat()` — 繰り返す

```js run
console.log('ab'.repeat(3));
console.log(JSON.stringify('ab'.repeat(0)));
```
```output
ababab
""
```

**負の数を渡すと落ちます。**

```js run
try {
  'a'.repeat(-1);
} catch (error) {
  console.log(error.name + ': ' + error.message);
}
```
```output
RangeError: Invalid count value: -1
```

計算した値を渡すときは、[bad:負にならないか]確かめてください。

## 使い分け

| やりたいこと | 使うもの |
|---|---|
| 前後の空白を落とす | `trim()` |
| 前だけ・後ろだけ | `trimStart()` / `trimEnd()` |
| ゼロ埋め・右寄せ | `padStart()` |
| 左寄せ | `padEnd()` |
| 区切り線を作る | `repeat()` |
| 真ん中の空白もまとめたい | `replace()` と正規表現 |

真ん中の連続した空白を1つにするなら、置換です。

```js run
console.log('a   b\t\tc'.replace(/\s+/g, ' '));
```
```output
a b c
```

→ [String.prototype.replace() と replaceAll()](/ja/javascript/reference/string/replace/)

## まとめ

- どれも**元の文字列は変えない**。返り値を使う
- `trim()` は[key:前後だけ]。タブ・改行・全角空白も落ちる
- 入力の照合は**必ず `trim()` してから**
- `padStart()` の引数は**仕上がりの長さ**。元が長いと何もしない
- 日本語では[bad:文字数を揃えても見た目の桁は揃わない]
- `repeat()` に負の数を渡すと `RangeError`
