An ialah objek dengan kaedah yang mengembalikan . Sebuah objek adalah jika ia mempunyai kaedah — itulah yang membuat dan spread berfungsi. A () ialah cara yang mudah untuk membuat iterators yang boleh dengan .
An ialah objek dengan kaedah yang mengembalikan . Sebuah objek adalah jika ia mempunyai kaedah — itulah yang membuat dan spread berfungsi. A () ialah cara yang mudah untuk membuat iterators yang boleh dengan .
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
Idea utama: pelaksanaan tergantung pada setiap yield dan sambung semula pada .next() seterusnya, mengekalkan keadaan tempatan antara panggilan. Tiada apa-apa dikira sehingga anda memintanya.
// 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
Generators membolehkan urutan malas/tak terbatas, iterasi tersuai, dan penstriman yang cekap memori.
Mereka juga merupakan asas perpustakaan async awal (co) dan mendasari iterasi async (for await...of).
Protokel iterator ialah apa yang menyatukan for...of, spread, dan destructuring merentasi tatasusunan, Maps, Sets, dan rentetan.