絵文字を含む文字列を一文字ずつ分割するときは split('') でなくサロゲートペアの正規表現を使う

絵文字などを含むテキストを一文字ずつ分割するとき、split(‘’) は予期しない結果を返します。

const word = 'AB😀C'

const items = word.split('')

console.log(items)
// ['A', 'B', '\uD83D', '\uDE00', 'C']

絵文字がコードポイントに分解してしまいました。JavaScript の String は UTF-16 をもとに開発されており、😀は UTF-16 のサロゲートペアで表現されているからです。

次の例も JavaScript の String を理解する助けになります。

const word = 'AB😀C'

console.log(word.length)
// 5

😀は 2 文字としてカウントされています。

split('') の代替

正規表現と match を使うと、絵文字も一文字として分割できます。

const word = 'AB😀C'

const array = word.match(/([\uD800-\uDBFF][\uDC00-\uDFFF])|./g)

console.log(array)
// ['A', 'B', '😀', 'C']

サロゲートペアは上位サロゲートと下位サロゲートのペアで

上位 D800 - DBFF
下位 DC00 - DFFF

となっています。正規表現の . は任意の文字を表します。