String.prototype.split()

split() は文字列を区切って配列にします。見つからないとき、空文字で分けたとき、絵文字が壊れる理由、連続した区切りの扱いまで、実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES1難易度●●○○○目安8更新

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

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'りんご', 'みかん', 'ぶどう' ] りんご,みかん,ぶどう
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'りんご', 'みかん' ] [ 'りんご' ] [ 'りんご' ] [ 'り', 'ん', 'ご' ]

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

何が返るのか

渡すもの 結果
区切り文字がある 区切って並べた配列
区切り文字が見つからない 元の文字列1つだけが入った配列
空文字 '' 1文字ずつ(絵文字は壊れる
何も渡さない 元の文字列1つだけが入った配列
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ '' ] 1 [] 0
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1 0

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

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

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

javascript
const text = 'あ🙂い';

console.log(text.length);
console.log(text.split('').length);
console.log(text.split('').map(c => c.codePointAt(0).toString(16)));
4 4 [ '3042', 'd83d', 'de42', '3044' ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'あ', '🙂', 'い' ] [ 'あ', '🙂', 'い' ] 4 3

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

未入力を件数で数えると1件あると誤解します

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ '🇯', '🇵' ] 2 4
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'あ', '🙂', '🇯🇵', 'い' ]

絵文字が壊れる

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

中身をコードポイント(16進数)で見ると、何が起きているか分かります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', '', 'b', '' ] 4
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', 'b', 'c' ]

人が数えると3文字ですが、length4です。

  • 3042
  • d83dde42🙂 を2つに割ったもの
  • 3044

d800dfff の範囲は単独では文字にならない半分です。 片方だけ取り出しても、元の絵文字には戻せません。

直しかた

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

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', 'b' ] []
javascript
const line = 'key: value: extra';

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

length4のままですが、[...text].length3です。 文字数を数えたいときは length を使わないでください。

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

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'key', 'value: extra' ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', '', 'b\tc\nd' ] [ 'a', 'b', 'c', 'd' ]

見た目どおりに数えるには Intl.Segmenter を使います(書記素の単位)。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', 'b', 'c' ] [ 'a', '1', 'b', '2', 'c' ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', 'b', 'c' ]

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

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

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

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
a,b,c a-b-c abc
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1--2--3

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

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'apple', 'banana', 'cherry' ] apple / banana / cherry

件数を制限する

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

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

extra消えました。こういうときは位置で切ります。

正規表現で分ける

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

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

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

戻すときは join

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

nullundefined空文字になります。

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

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

区切らずに置き換えたいだけなら String.prototype.replace() と replaceAll() を使います。

分けたあとに数えた個数が見た目と合わないときは、符号単位で分けている可能性があります。 → 文字を正しく数える

この記事の根拠

  1. String.prototype.split — ECMAScript® 2026 Language Specificationtc39.es
  2. String.prototype.split() — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)