JavaScript/Array Iterator Objects
Array Iterator Objects
は、配列要素を反復処理するためのイテレータオブジェクトです。これらのオブジェクトは、配列の values()
、keys()
、entries()
メソッドや、for...of
ループなどから生成され、配列の要素に順次アクセスするための標準的な方法を提供します[1]。
構造
Array Iterator Objects は以下の内部スロットを持ちます:
- [[IteratedObject]]: 反復処理される配列オブジェクト
- [[ArrayIteratorNextIndex]]: 次に処理される配列要素のインデックス
- [[ArrayIterationKind]]: イテレーションの種類(key, value, key+value)
メソッド
Array Iterator.prototype.next()
next()
メソッドは、イテレータの次の結果を返します。結果は { value, done }
という形式のオブジェクトで、value
は現在の要素の値、done
はイテレーションが完了したかどうかを示すブール値です。
Array Iterator.prototype[@@toStringTag]
[@@toStringTag]
プロパティは "Array Iterator" という文字列を返します。
例
Array.prototype.values() で配列を反復処理するプログラム
以下のプログラムは、Array.prototype.values()
メソッドを使用して配列の要素を反復処理します。
const arr = ['a', 'b', 'c']; const iterator = arr.values(); console.log(iterator.next()); // { value: 'a', done: false } console.log(iterator.next()); // { value: 'b', done: false } console.log(iterator.next()); // { value: 'c', done: false } console.log(iterator.next()); // { value: undefined, done: true }
このプログラムでは、values()
メソッドを使用して配列のイテレータを取得し、next()
メソッドを呼び出して順番に配列の各要素にアクセスしています。すべての要素を処理した後、done
プロパティが true
になります。
for...of ループで配列を反復処理するプログラム
以下のプログラムは、for...of
ループを使用して配列の要素を反復処理します。
const arr = ['a', 'b', 'c']; for (const value of arr) { console.log(value); } // 'a' // 'b' // 'c'
このプログラムでは、for...of
ループを使用して配列の各要素を反復処理しています。for...of
ループは内部的に Array Iterator を使用しています。
Array.prototype.keys() で配列のインデックスを反復処理するプログラム
以下のプログラムは、Array.prototype.keys()
メソッドを使用して配列のインデックスを反復処理します。
const arr = ['a', 'b', 'c']; const iterator = arr.keys(); for (const key of iterator) { console.log(key); } // 0 // 1 // 2
このプログラムでは、keys()
メソッドを使用して配列のインデックスのイテレータを取得し、for...of
ループで反復処理しています。
Array.prototype.entries() で配列のキーと値のペアを反復処理するプログラム
以下のプログラムは、Array.prototype.entries()
メソッドを使用して配列のインデックスと値のペアを反復処理します。
const arr = ['a', 'b', 'c']; const iterator = arr.entries(); for (const [index, value] of iterator) { console.log(`${index}: ${value}`); } // '0: a' // '1: b' // '2: c'
このプログラムでは、entries()
メソッドを使用して配列のインデックスと値のペアのイテレータを取得し、for...of
ループで反復処理しています。分割代入を使用して、各ペアからインデックスと値を取り出しています。
注意点
- 配列の変更: イテレーション中に配列が変更されると、イテレータは変更された配列に対して動作します。
- スパース配列: スパース配列(疎配列)では、存在しない要素もイテレータにより処理されます。
- イテレータの再利用: イテレータは一度使い切ると、再利用することはできません。新しいイテレータを作成する必要があります。
- イテレータのプロトコル: Array Iterator オブジェクトは、イテレータプロトコルを実装しています。
プロパティとメソッド
インスタンスプロパティ
名称 | 解説 |
---|---|
Iterator.prototype [ Symbol.toStringTag ] |
Object.prototype.toString() メソッドで使用される、オブジェクトの既定の文字列表現を指定するシンボルです。イテレーターオブジェクトの場合、"Iterator" という文字列を返します。 |
インスタンスアクセサ
インスタンスメソッド
名称 | 解説 |
---|---|
Iterator.prototype.next() |
イテレーターから次の値を返します。 |
脚註
- ↑ Array Iterator Objects は、配列の要素を順番に処理するために使用されます。