je objekt z metodo , ki vrne . Objekt je , če ima metodo — to je tisto, kar naredi in spread delovanja. () je priročen način za ustvarjanje iteratorjev, ki se lahko s .
je objekt z metodo , ki vrne . Objekt je , če ima metodo — to je tisto, kar naredi in spread delovanja. () je priročen način za ustvarjanje iteratorjev, ki se lahko s .
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
Glavna ideja: izvajanje se prekineta pri vsakem yield in se nadaljuje pri naslednjem .next(), pri čemer se ohranja lokalno stanje med klici. Nič se ne izračuna, dokler se ne zaprosite.
// 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
Generatorji omogočajo lene/neskončne sekvence, prilagojeno iteracijo in učinkovit streaming glede na pomnilnik.
Bili so tudi osnova zgodnjih asincronnih knjižnic (co) in so temelj asincrone iteracije (for await...of).
Protokol iteratorja je tisti, ki enotni for...of, spread in dekonstrukcijo v poljih, Maps, Sets in nizih.