Symbol.iterator
Symbol.iterator
はウェルノウンシンボルで、オブジェクトの既定のイテレーターを指定します。 for...of
で使用されます。
試してみましょう
解説
オブジェクトを反復処理する必要がある場合(for..of
ループの開始時など)は常に、その @@iterator
メソッドが引数なしで呼び出され、返されたイテレーターを使用して反復処理される値が取得されます。
一部の組み込み型には既定の反復動作がありますが、他の型(Object
など)にはありません。@@iterator
メソッドの組み込み型は次のとおりです。
Array.prototype[@@iterator]()
TypedArray.prototype[@@iterator]()
String.prototype[@@iterator]()
Map.prototype[@@iterator]()
Set.prototype[@@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