Ein ist ein Objekt mit einer Methode, die zurückgibt. Ein Objekt ist , wenn es eine Methode hat — das ist es, was und Spread möglich macht. Ein () ist eine praktische Möglichkeit, Iteratoren zu erstellen, die mit werden können.
Ein ist ein Objekt mit einer Methode, die zurückgibt. Ein Objekt ist , wenn es eine Methode hat — das ist es, was und Spread möglich macht. Ein () ist eine praktische Möglichkeit, Iteratoren zu erstellen, die mit werden können.
next(){ value, done }[Symbol.iterator]for...offunction*yieldfunction* 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
Die Kernidee: Die Ausführung wird bei jedem yield unterbrochen und beim nächsten .next() fortgesetzt, wobei der lokale Zustand zwischen Aufrufen erhalten bleibt. Nichts wird berechnet, bis du danach fragst.
// 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
Generatoren ermöglichen faule/unendliche Sequenzen, benutzerdefinierte Iteration und speichereffizientes Streaming.
Sie waren auch die Grundlage früher async-Bibliotheken (co) und sind die Basis für async-Iteration (for await...of).
Das Iterator-Protokoll ist es, das for...of, Spread und Destructuring über Arrays, Maps, Sets und Strings vereinheitlicht.