Iterator

Iterator オブジェクトは、イテレーターの結果オブジェクトを返す next() メソッドを提供することで、イテレータープロトコルに準拠したオブジェクトです。Iterator.prototype オブジェクトは、すべての組み込みイテレーターが継承する、隠れたグローバルオブジェクトです。これは、イテレーターオブジェクト自身を返す @@iterator メソッドを提供し、イテレーターを反復可能にしています。

なお、Iterator はグローバルオブジェクトではありませんが、将来的にはイテレーターヘルパーの提案でグローバルオブジェクトになる予定です。すべての組み込みイテレーターに共通する Iterator.prototype オブジェクトは、以下のコードで得ることができます。

js
const IteratorPrototype = Object.getPrototypeOf(
  Object.getPrototypeOf([].values()),
);

解説

以下のものは、すべて JavaScript の組み込みイテレーターです。

これらのイテレーターはそれぞれ個別のプロトタイプオブジェクトを持っており、特定のイテレーターが使用する 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

関連情報