Iterator
Iterator オブジェクトは、イテレーターの結果オブジェクトを返す next() メソッドを提供することで、イテレータープロトコルに準拠したオブジェクトです。Iterator.prototype オブジェクトは、すべての組み込みイテレーターが継承する、隠れたグローバルオブジェクトです。これは、イテレーターオブジェクト自身を返す @@iterator メソッドを提供し、イテレーターを反復可能にしています。
なお、Iterator はグローバルオブジェクトではありませんが、将来的にはイテレーターヘルパーの提案でグローバルオブジェクトになる予定です。すべての組み込みイテレーターに共通する Iterator.prototype オブジェクトは、以下のコードで得ることができます。
js
const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values()));
解説
以下のものは、すべて JavaScript の組み込みイテレーターです。
- 配列イテレーター:
Array.prototype.values()、Array.prototype.keys()、Array.prototype.entries()、Array.prototype[@@iterator]()、TypedArray.prototype.values()、TypedArray.prototype.keys()、TypedArray.prototype.entries()、TypedArray.prototype[@@iterator]()、arguments[@@iterator]()で返されます。 - String イテレーター:
String.prototype[@@iterator]()で返されます。 - Map イテレーター:
Map.prototype.values()、Map.prototype.keys()、Map.prototype.entries()、Map.prototype[@@iterator]()で返されます。 - Set イテレーター:
Set.prototype.values()、Set.prototype.keys()、Set.prototype.entries()、Set.prototype[@@iterator]()で返されます。 - RegExp String イテレーター:
RegExp.prototype[@@matchAll]()、String.prototype.matchAll()で返されます。 Generatorオブジェクト: ジェネレーター関数で返されます。- Segments イテレーター:
Intl.Segmenter.prototype.segment()で返されるSegmentsオブジェクトの[@@iterator]()メソッドで返されます。
これらのイテレーターはそれぞれ個別のプロトタイプオブジェクトを持っており、特定のイテレーターが使用する next() メソッドを定義しています。例えば、すべての String イテレーターオブジェクトは、隠しオブジェクトである StringIteratorPrototype を継承しており、このオブジェクトは、その文字列をコードポイントごとに反復処理する next() メソッドを持っています。また、 StringIteratorPrototype は @toStringTag プロパティを持っており、初期値は文字列 "String Iterator" となります。このプロパティは Object.prototype.toString() で使用します。同様に、他のイテレータープロトタイプも自分自身で @@toStringTag の値を持ち、それは上で指定された名前と同じです。
これらのプロトタイプオブジェクトはすべて Iterator.prototype を継承しており、イテレーターオブジェクト自身を返す @@iterator メソッドを提供し、イテレーターを反復可能にもしています。
インスタンスメソッド
Iterator.prototype[@@iterator]()-
イテレーターオブジェクト自身を返します。これにより、イテレータオブジェクトが反復可能にもなります。
例
イテレーターを反復可能オブジェクトとして使用
すべての組み込みイテレーターは反復可能でもあるので、for...of ループの中で使うことができます。
js
const arrIterator = [1, 2, 3].values();
for (const value of arrIterator) {
console.log(value);
}
// Logs: 1, 2, 3
仕様書
| Specification |
|---|
| ECMAScript Language Specification # sec-%iteratorprototype%-object |
ブラウザーの互換性
BCD tables only load in the browser