JavaScript iterators and generators are tools for working with sequences of values. Iterators provide a standard way to access items one-by-one, while generators make it easier to create custom iterators using special functions that can pause and resume.
Together, they help you build lazy sequences, infinite streams, and readable iteration logic for arrays, custom objects, and more.
next() method that returns { value, done }.[Symbol.iterator]() and can be used in for...of.function* and uses yield to produce values.yield.next() call).An object is an iterator if it has a next() method that returns an object with:
value: The current value.done: false if there are more values, true when iteration is finished.A generator is created by calling a function*. Inside it, you use yield to send values out one by one:
yield x; pauses execution and outputs x.return x; ends the generator and sets the final value when done: true.yield* delegates to another generator or iterable.Arrays are built-in iterables. You can get their iterator using [Symbol.iterator]().
const arr = [10, 20, 30];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 10, done: false }
console.log(iterator.next()); // { value: 20, done: false }
console.log(iterator.next()); // { value: 30, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
A generator can produce a sequence of values with yield:
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
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 }
Generators are ideal for infinite or very large sequences because values are generated on demand.
function* infiniteNumbers() {
let i = 0;
while (true) {
yield i++;
}
}
const numbers = infiniteNumbers();
console.log(numbers.next().value); // 0
console.log(numbers.next().value); // 1
console.log(numbers.next().value); // 2
next() ResultsIterator example:
{ value: 10, done: false } → first array element, not finished.{ value: 20, done: false } → second element.{ value: 30, done: false } → third element.{ value: undefined, done: true } → no more elements; iteration completed.Generator example:
gen.next() runs the generator until the next yield.1, 2, and 3 are yielded one by one.yield statements, done becomes true.Infinite generator:
numbers.next().value gives the next integer: 0, 1, 2, and so on.while (true), done never becomes true unless you stop using it.[Symbol.iterator]() and returning an iterator or generator.range, take, or filterValues for readability.yield* to delegate to another generator or iterable and avoid nested loops.function* squares() that yields square numbers 1, 4, 9, 16, 25 and then finishes.[Symbol.iterator] to iterate over only even numbers in an array.evens() and odds(), then create a third generator function* numbers() that uses yield* to delegate to both."ID-1", "ID-2", and so on.