JavaScript/Iterator/prototype/Symbol.iterator
表示
Iterator.prototype[Symbol.iterator]()
は、イテレータオブジェクト自身を返すメソッドです。このメソッドは、イテレータオブジェクトが反復可能(iterable)であることを保証するために使用されます[1]。
構文
[編集]iterator[Symbol.iterator]()
- このメソッドは引数を取りません。
例
[編集]イテレータ自身を返すプログラム
[編集]以下のプログラムは、Iterator.prototype[Symbol.iterator]()
がイテレータ自身を返すことを示しています。
const array = [1, 2, 3]; const iterator = array[Symbol.iterator](); // イテレータ自身がSymbol.iteratorメソッドを持っていることを確認 const sameIterator = iterator[Symbol.iterator](); console.log(iterator === sameIterator); // true
このプログラムでは、配列から取得したイテレータに対して Symbol.iterator
メソッドを呼び出し、その結果が元のイテレータと同じオブジェクトであることを確認しています。
for...ofループでイテレータを直接使用するプログラム
[編集]以下のプログラムは、イテレータを for...of ループで直接使用する例を示しています。
const array = ['a', 'b', 'c']; const iterator = array[Symbol.iterator](); // 最初の要素を取得 console.log(iterator.next().value); // 'a' // 残りの要素を for...of ループで反復処理 for (const value of iterator) { console.log(value); } // 出力: // 'b' // 'c'
このプログラムでは、イテレータから最初の要素を取得した後、残りの要素を for...of ループで反復処理しています。イテレータが Symbol.iterator
メソッドを持っているため、for...of ループで直接使用できます。
イテレータの連鎖的な使用
[編集]以下のプログラムは、イテレータの連鎖的な使用例を示しています。
function* generateNumbers() { yield 1; yield 2; yield 3; } const generator = generateNumbers(); const values = []; // generatorは反復可能なイテレータ for (const value of generator) { values.push(value); // 各反復で最初の要素だけ取り出したら中断 break; } // 残りの値を再度反復処理 for (const value of generator) { values.push(value); } console.log(values); // [1, 2, 3]
このプログラムでは、ジェネレータから得られるイテレータを連鎖的に使用しています。最初のループで1つの要素を取得した後、2番目のループで残りの要素を取得しています。これは Symbol.iterator
メソッドがイテレータ自身を返すため可能となります。
注意点
[編集]- 自己参照:
Iterator.prototype[Symbol.iterator]()
は常にイテレータ自身(this
)を返します。 - iterable プロトコルの実装: このメソッドは、イテレータが iterable プロトコルを実装するために使用されます。
- for...of 互換性: このメソッドにより、イテレータオブジェクトを for...of ループなどの反復構文で直接使用できます。
- 状態の保持: イテレータの状態は保持されるため、複数の反復処理で連続して使用できます。
脚註
[編集]- ^ これにより、イテレータオブジェクトを for...of ループなどの反復構文で直接使用できるようになります。
外部リンク
[編集]