Iterator
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Iterator
オブジェクトは、イテレーターの結果オブジェクトを返す next()
メソッドを提供することで、イテレータープロトコルに準拠したオブジェクトです。Iterator.prototype
オブジェクトは、すべての組み込みイテレーターが継承する、隠れたグローバルオブジェクトです。これは、イテレーターオブジェクト自身を返す @@iterator
メソッドを提供し、イテレーターを反復可能にしています。
なお、Iterator
はグローバルオブジェクトではありませんが、将来的にはイテレーターヘルパーの提案でグローバルオブジェクトになる予定です。すべての組み込みイテレーターに共通する Iterator.prototype
オブジェクトは、以下のコードで得ることができます。
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
ループの中で使うことができます。
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