String.prototype[Symbol.iterator]()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

[Symbol.iterator]()String 値のメソッドで、反復可能プロトコルを実装しており、スプレッド構文for...of ループなど、反復可能オブジェクトを期待するほとんどの構文で文字列が利用できるようにします。これは、文字列値の Unicode コードポイントを個別の文字列として返す文字列イテレーターオブジェクトを返します。

試してみましょう

構文

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 ループを用いた反復処理

このメソッドを直接呼び出す必要はほとんどないことに注意してください。[Symbol.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-%symbol.iterator%

ブラウザーの互換性

BCD tables only load in the browser

関連情報