π Generators = Iterable Functions
Normal functions run completely. Generators pause and resume. Infinite lists, async flows, custom iteration.
π Generator Basics
// Generator function
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
// Using generator
const gen = numberGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
// For-of loop
for (const num of numberGenerator()) {
console.log(num); // 1, 2, 3
}
// Spread operator
const numbers = [...numberGenerator()]; // [1, 2, 3]
// Infinite sequence
function* infiniteNumbers() {
let i = 0;
while (true) {
yield i++;
}
}
const infinite = infiniteNumbers();
console.log(infinite.next().value); // 0
console.log(infinite.next().value); // 1
console.log(infinite.next().value); // 2
π― Advanced Generators
// Fibonacci sequence
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fib = fibonacci();
console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2
console.log(fib.next().value); // 3
// Yield with return value
function* generatorWithReturn() {
yield 1;
yield 2;
return 3; // Ends generator
}
const gen2 = generatorWithReturn();
console.log(gen2.next()); // { value: 1, done: false }
console.log(gen2.next()); // { value: 2, done: false }
console.log(gen2.next()); // { value: 3, done: true }
π‘ Generator Use Cases
- Infinite sequences
- Lazy evaluation
- State machines
- Async flows
- Data pagination
“Generators enable lazy iteration. Infinite lists, state machines. Essential for advanced JavaScript.”
