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]()
メソッドの組み込み型は次のとおりです。
Array.prototype[Symbol.iterator]()
TypedArray.prototype[Symbol.iterator]()
String.prototype[Symbol.iterator]()
Map.prototype[Symbol.iterator]()
Set.prototype[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'
非整形反復処理
もし反復可能項目の [Symbol.iterator]()
メソッドがイテレーターオブジェクトを返さない場合、それは非整形反復可能項目です。それを使用すると、実行時に例外が発生したり、バグが発生したりする可能性があります。
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