String.prototype[@@iterator]()

[@@iterator]()String 値のメソッドで、反復可能プロトコルを実装しており、スプレッド構文for...ofループ 文字列値のコードポイントを走査し、それぞれのコードポイントを文字列値として返すイテレーターオブジェクトを返します。

試してみましょう

構文

js
string[Symbol.iterator]()

返値

新しい反復可能なイテレーターオブジェクトで、この文字列の各 Unicode コードポイントを、独立した文字列として生成します。

解説

文字列は Unicode コードポイントで反復処理されます。つまり、書記素クラスターは分割されますが、サロゲートペアは保持されます。

js
// "Backhand Index Pointing Right: Dark Skin Tone"
[..."👉🏿"]; // ['👉', '🏿']
// 基本的な "Backhand Index Pointing Right" の絵文字と
// "Dark skin tone" の絵文字に分割

// "Family: Man, Boy"
[..."👨‍👦"]; // [ '👨', '‍', '👦' ]
// "Man" と "Boy" の絵文字に分割され、 ZWJ で結合されます。

for...of ループを用いた反復処理

このメソッドを直接呼び出す必要はほとんどないことに注意してください。iterator メソッドが存在することで、文字列は反復可能になり、for...of ループのような反復処理構文は自動的にこのメソッドを呼び出して、ループするイテレーターを取得します。

js
const str = "A\uD835\uDC68B\uD835\uDC69C\uD835\uDC6A";

for (const v of str) {
  console.log(v);
}
// "A"
// "\uD835\uDC68"
// "B"
// "\uD835\uDC69"
// "C"
// "\uD835\uDC6A"

イテレーターを手動で手繰る

反復処理を最大限に制御するために、返すイテレーターオブジェクトの next() メソッドを手動で呼び出すこともできます。

js
const str = "A\uD835\uDC68";

const strIter = str[Symbol.iterator]();

console.log(strIter.next().value); // "A"
console.log(strIter.next().value); // "\uD835\uDC68"

仕様書

Specification
ECMAScript Language Specification
# sec-string.prototype-@@iterator

ブラウザーの互換性

BCD tables only load in the browser

関連情報