---
type: reference
language: javascript
slug: string/split
title: "String.prototype.split()"
title_tag: "JavaScript split() の使い方 — 文字列を配列に分ける"
summary: >
  split() は文字列を区切って配列にします。見つからないとき、空文字で分けたとき、
  絵文字が壊れる理由、連続した区切りの扱いまで、実行して確かめます。
description: >
  見つからなくても空にはならず、元の文字列が1つ入った配列が返ります。空文字で分けると絵文字が壊れる理由、連続した区切りで空文字が入る理由まで扱います。
status: published
difficulty: 2
minutes: 8

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

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

terms: [区切り文字, サロゲートペア, 書記素]

links:
  related:
    - javascript/learn/string/basics
    - javascript/learn/string/unicode
    - javascript/reference/string/replace
    - javascript/reference/array/map
    - javascript/how-to/string/to-number

content_updated_at: 2026-09-07
published_at: 2026-09-07
---

`split()` は、文字列を[key:区切り文字で分けて配列]にします。
元の文字列は変わりません。

```js run
const csv = 'りんご,みかん,ぶどう';

console.log(csv.split(','));
console.log(csv);
```
```output
[ 'りんご', 'みかん', 'ぶどう' ]
りんご,みかん,ぶどう
```

上のコードは書き換えて実行できます。区切りを `','` から `'ん'` にしてみてください。

## 何が返るのか

| 渡すもの | 結果 |
|---|---|
| 区切り文字がある | 区切って並べた配列 |
| **区切り文字が見つからない** | [key:元の文字列1つだけ]が入った配列 |
| **空文字 `''`** | [num:1]文字ずつ（**絵文字は壊れる**） |
| **何も渡さない** | 元の文字列1つだけが入った配列 |

```js run
console.log('りんご,みかん'.split(','));
console.log('りんご'.split(','));
console.log('りんご'.split());
console.log('りんご'.split(''));
```
```output
[ 'りんご', 'みかん' ]
[ 'りんご' ]
[ 'りんご' ]
[ 'り', 'ん', 'ご' ]
```

**見つからなくても空配列にはなりません。** 必ず[num:1]件以上返ります。
`length === 1` かどうかで「区切りがあったか」を判定できます。

## 空文字列を分けると空文字が返る

`''.split(',')` は空配列ではありません。**空文字が1つ入った配列**です。

```js run
console.log(''.split(','));
console.log(''.split(',').length);
console.log(''.split(''));
console.log(''.split('').length);
```
```output
[ '' ]
1
[]
0
```

`''.split(',')` は `[ '' ]` で長さ[num:1]、`''.split('')` は `[]` で長さ[num:0]。
**区切りが空文字のときだけ、特別に空配列になります。**

未入力を件数で数えると[bad:1件あると誤解します]。

```js run
const input = '';

console.log(input.split(',').length);
console.log(input.split(',').filter(s => s !== '').length);
```
```output
1
0
```

## 絵文字が壊れる

`split('')` は[key:16ビット単位]で切ります。絵文字や一部の漢字は
[num:2]つの単位（[type:サロゲートペア]）でできているので、[bad:半分に割れます]。

中身をコードポイント（[num:16]進数）で見ると、何が起きているか分かります。

```js bad
const text = 'あ🙂い';

console.log(text.length);
console.log(text.split('').length);
console.log(text.split('').map(c => c.codePointAt(0).toString(16)));
```
```output
4
4
[ '3042', 'd83d', 'de42', '3044' ]
```

**人が数えると[num:3]文字ですが、`length` は[num:4]です。**

- `3042` … `あ`
- `d83d` と `de42` … **`🙂` を2つに割ったもの**
- `3044` … `い`

`d800`〜`dfff` の範囲は[key:単独では文字にならない半分]です。
片方だけ取り出しても、元の絵文字には戻せません。

### 直しかた

スプレッド構文か `Array.from()` を使います。どちらも[key:文字の単位]で区切ります。

```js run
const text = 'あ🙂い';

console.log([...text]);
console.log(Array.from(text));
console.log(text.length, [...text].length);
```
```output
[ 'あ', '🙂', 'い' ]
[ 'あ', '🙂', 'い' ]
4 3
```

`length` は[num:4]のままですが、`[...text].length` は[num:3]です。
**文字数を数えたいときは `length` を使わないでください。**

**それでも足りない場合があります。** 国旗や肌の色つきの絵文字は、
複数の文字が組み合わさって[num:1]つに見えています。

```js run
const flag = '🇯🇵';

console.log([...flag]);
console.log([...flag].length);
console.log(flag.length);
```
```output
[ '🇯', '🇵' ]
2
4
```

見た目どおりに数えるには `Intl.Segmenter` を使います（[type:書記素]の単位）。

```js run
const seg = new Intl.Segmenter('ja', { granularity: 'grapheme' });

console.log([...seg.segment('あ🙂🇯🇵い')].map(s => s.segment));
```
```output
[ 'あ', '🙂', '🇯🇵', 'い' ]
```

[dim:Intl.Segmenter は Node 16 / Chrome 87 / Safari 14.1 以降で使えます。]

## 連続した区切りは空文字になる

区切りが並んでいると、その間に[key:空文字]が入ります。

```js run
const text = 'a,,b,';

console.log(text.split(','));
console.log(text.split(',').length);
```
```output
[ 'a', '', 'b', '' ]
4
```

末尾の `,` の後ろも[num:1]件として数えられています。
**空の項目を捨てたいなら、自分で落としてください。**

```js run
const text = 'a,,b, ,c';

console.log(text.split(',').filter(s => s.trim() !== ''));
```
```output
[ 'a', 'b', 'c' ]
```

## 件数を制限する

第2引数で、**返す件数の上限**を指定できます。

```js run
const text = 'a,b,c,d';

console.log(text.split(',', 2));
console.log(text.split(',', 0));
```
```output
[ 'a', 'b' ]
[]
```

**残りは捨てられます。** 「最初の1つとそれ以外」に分けたいときには使えません。

```js bad
const line = 'key: value: extra';

console.log(line.split(': ', 2));
```
```output
[ 'key', 'value' ]
```

`extra` が[bad:消えました]。こういうときは位置で切ります。

```js run
const line = 'key: value: extra';
const i = line.indexOf(': ');

console.log([line.slice(0, i), line.slice(i + 2)]);
```
```output
[ 'key', 'value: extra' ]
```

## 正規表現で分ける

区切りに正規表現を渡せます。**空白の数がばらばらなときに使えます。**

```js run
const text = 'a  b\tc\nd';

console.log(text.split(' '));
console.log(text.split(/\s+/));
```
```output
[ 'a', '', 'b\tc\nd' ]
[ 'a', 'b', 'c', 'd' ]
```

丸括弧（キャプチャ）を書くと、**区切りそのものも結果に入ります。**

```js run
const text = 'a1b2c';

console.log(text.split(/\d/));
console.log(text.split(/(\d)/));
```
```output
[ 'a', 'b', 'c' ]
[ 'a', '1', 'b', '2', 'c' ]
```

区切りを残したくないなら、括弧を `(?:…)` にします。

```js run
console.log('a1b2c'.split(/(?:\d)/));
```
```output
[ 'a', 'b', 'c' ]
```

## 戻すときは join

`join()` が対になります。**引数を省くと `,` で繋がります。**

```js run
const parts = ['a', 'b', 'c'];

console.log(parts.join());
console.log(parts.join('-'));
console.log(parts.join(''));
```
```output
a,b,c
a-b-c
abc
```

`null` と `undefined` は[key:空文字]になります。

```js run
console.log([1, null, 2, undefined, 3].join('-'));
```
```output
1--2--3
```

行に分けて処理し、また繋ぐ形はよく使います。

```js run
const text = ' apple \n banana \n\n cherry ';

const lines = text
  .split('\n')
  .map(s => s.trim())
  .filter(s => s !== '');

console.log(lines);
console.log(lines.join(' / '));
```
```output
[ 'apple', 'banana', 'cherry' ]
apple / banana / cherry
```

[dim:改行は環境によって \n と \r\n があります。両方に対応するなら split(/\r?\n/) と書きます。]

区切らずに置き換えたいだけなら
[String.prototype.replace() と replaceAll()](/ja/javascript/reference/string/replace/) を使います。

分けたあとに数えた個数が見た目と合わないときは、**符号単位で分けている**可能性があります。
→ [文字を正しく数える](/ja/javascript/learn/string/unicode/)
