Symbol.iterator

Symbol.iterator はウェルノウンシンボルで、オブジェクトの既定の反復子を指定します。 for...of で使用されます。

試してみましょう

解説

オブジェクトを反復処理する必要がある場合(for..of ループの開始時など)は常に、その @@iterator メソッドが引数なしで呼び出され、返された反復子を使用して反復処理される値が取得されます。

一部の組み込み型には既定の反復動作がありますが、他の型(Object など)にはありません。@@iterator メソッドの組み込み型は次のとおりです。

詳細については、反復処理プロトコルも参照してください。

Symbol.iterator のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能 不可

ユーザー定義の反復可能項目

次のように独自の反復可能オブジェクトを作成できます。

const myIterable = {}
myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
[...myIterable] // [1, 2, 3]

または、計算されたプロパティを使用して、クラスやオブジェクト内で反復可能オブジェクトを直接定義できます。

class Foo {
  *[Symbol.iterator] () {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator] () {
    yield 'a';
    yield 'b';
  }
}

console.log(...new Foo); // 1, 2, 3
console.log(...someObj); // 'a', 'b'

非整形反復処理

もし反復可能項目の @@iterator メソッドが反復子オブジェクトを返さない場合、それは非整形反復可能項目です。それを使用すると、実行時に例外が発生したり、バグが発生したりする可能性があります。

const nonWellFormedIterable = {}
nonWellFormedIterable[Symbol.iterator] = () => 1
[...nonWellFormedIterable] // TypeError: [] is not a function

仕様書

Specification
ECMAScript Language Specification
# sec-symbol.iterator

ブラウザーの互換性

BCD tables only load in the browser

関連情報