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 September 2015.

Symbol.iterator は静的データプロパティで、ウェルノウンシンボルである Symbol.iterator を表します。反復可能プロトコルは、オブジェクトのイテレーターを返すメソッドを、このシンボルで探します。オブジェクトが反復可能であるためには、[Symbol.iterator] キーを持っていなければなりません。

試してみましょう

ウェルノウンシンボル Symbol.iterator です。

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

解説

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

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

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

ユーザー定義の反復可能オブジェクト

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

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

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

js
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'

非整形反復処理

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

js
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value

仕様書

Specification
ECMAScript Language Specification
# sec-symbol.iterator

ブラウザーの互換性

BCD tables only load in the browser

関連情報