イテレータ(iterator)は、{ value, done } を返す next() メソッドを持つオブジェクトです。オブジェクトは [Symbol.iterator] メソッドを持っていれば反復可能(iterable)一時停止と再開ができるイテレータを作るための便利な方法です。
イテレータ(iterator)は、{ value, done } を返す next() メソッドを持つオブジェクトです。オブジェクトは [Symbol.iterator] メソッドを持っていれば反復可能(iterable)一時停止と再開ができるイテレータを作るための便利な方法です。
for...of やスプレッドを機能させます。ジェネレータ(generator)(function*)は、yield でfunction* idGenerator() {
let id = 1;
while (true) { // infinite, but lazy — only computes on demand
yield id++; // pause here, return a value, resume on next()
}
}
const gen = idGenerator();
gen.next().value; // 1
gen.next().value; // 2 — execution resumed where it paused
重要な考え方は、実行が各 yield で中断し、次の .next() で再開することです。呼び出し間でローカルの状態が保持されます。要求するまで何も計算されません。
// process a huge/infinite sequence without building it all in memory
function* take(iterable, n) {
let i = 0;
for (const x of iterable) {
if (i++ >= n) return;
yield x;
}
}
[...take(idGenerator(), 3)]; // [1, 2, 3] — from an infinite generator
const range = {
from: 1, to: 3,
*[Symbol.iterator]() { for (let i = this.from; i <= this.to; i++) yield i; },
};
[...range]; // [1, 2, 3] — works with for...of and spread
ジェネレータは、遅延/無限のシーケンス、カスタムな反復、メモリ効率の良いストリーミングを可能にします。
また初期の非同期ライブラリ(co)の基盤でもあり、非同期反復(for await...of)を支えています。
イテレータプロトコルは、配列・Map・Set・文字列にわたって for...of、スプレッド、分割代入を統一するものです。