Ένας είναι ένα αντικείμενο με μια μέθοδο που επιστρέφει . Ένα αντικείμενο είναι αν έχει μια μέθοδο — αυτό είναι αυτό που κάνει το και το spread να δουλεύουν. Ένας () είναι ένας βολικός τρόπος δημιουργίας iterators που μπορούν να με .
Ένας είναι ένα αντικείμενο με μια μέθοδο που επιστρέφει . Ένα αντικείμενο είναι αν έχει μια μέθοδο — αυτό είναι αυτό που κάνει το και το spread να δουλεύουν. Ένας () είναι ένας βολικός τρόπος δημιουργίας iterators που μπορούν να με .
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
Η βασική ιδέα: η εκτέλεση διακόπτεται σε κάθε 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
Oι generators ενεργοποιούν μεμψίμοιρες/άπειρες ακολουθίες, προσαρμοσμένη επανάληψη και αποδοτικό streaming σε σχέση με τη μνήμη.
Ήταν επίσης η βάση των πρώιμων async libraries (co) και αποτελούν τη βάση της async iteration (for await...of).
Το iterator protocol είναι αυτό που ενοποιεί for...of, spread και destructuring σε arrays, Maps, Sets και strings.