Sebuah adalah object dengan method yang mengembalikan . Sebuah object adalah jika memiliki method — itulah yang membuat dan spread bekerja. Sebuah () adalah cara yang nyaman untuk membuat iterators yang dapat dengan .
Sebuah adalah object dengan method yang mengembalikan . Sebuah object adalah jika memiliki method — itulah yang membuat dan spread bekerja. Sebuah () adalah cara yang nyaman untuk membuat iterators yang dapat dengan .
next(){ value, done }[Symbol.iterator]for...offunction*yieldGenerators menghasilkan nilai secara malas
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
Ide utamanya: eksekusi ditunda pada setiap yield dan dilanjutkan pada .next() berikutnya, mempertahankan state lokal antar calls. Tidak ada yang dihitung sampai 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 memungkinkan sequences malas/tak terbatas, iterasi kustom, dan streaming yang efisien memori.
Mereka juga menjadi dasar dari library async awal (co) dan mendasari iterasi async (for await...of).
Protokol iterator adalah yang menyatukan for...of, spread, dan destructuring di seluruh arrays, Maps, Sets, dan strings.