コンテンツにスキップ

JavaScript/Iterator/prototype/Symbol.iterator

出典: フリー教科書『ウィキブックス(Wikibooks)』

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 ループなどの反復構文で直接使用できます。
  • 状態の保持: イテレータの状態は保持されるため、複数の反復処理で連続して使用できます。

脚註

[編集]
  1. ^ これにより、イテレータオブジェクトを for...of ループなどの反復構文で直接使用できるようになります。

外部リンク

[編集]