Docs
README
17.4 Iterators and Iterables
Overview
Iterators and iterables are protocols that allow objects to define their iteration behavior. They enable the use of for...of loops, spread operator, and other iteration constructs.
The Protocols
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Iterator and Iterable Protocols ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā ITERABLE PROTOCOL ā
ā āāāāāāāāāāāāāāāāā ā
ā An object is iterable if it has a [Symbol.iterator] method ā
ā that returns an iterator. ā
ā ā
ā const iterable = { ā
ā [Symbol.iterator]() { ā
ā return iterator; // Returns an iterator object ā
ā } ā
ā }; ā
ā ā
ā ITERATOR PROTOCOL ā
ā āāāāāāāāāāāāāāāāā ā
ā An object is an iterator if it has a next() method that returns ā
ā { value: any, done: boolean } ā
ā ā
ā const iterator = { ā
ā next() { ā
ā return { value: 1, done: false }; ā
ā // or { done: true } when finished ā
ā } ā
ā }; ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Built-in Iterables
| Type | Description |
|---|---|
| String | Iterates over characters |
| Array | Iterates over elements |
| Map | Iterates over [key, value] pairs |
| Set | Iterates over values |
| TypedArray | Iterates over elements |
| arguments | Iterates over arguments |
| NodeList | Iterates over nodes |
Custom Iterator Example
const range = {
start: 1,
end: 5,
[Symbol.iterator]() {
let current = this.start;
const last = this.end;
return {
next() {
if (current <= last) {
return { value: current++, done: false };
}
return { done: true };
},
};
},
};
for (const num of range) {
console.log(num); // 1, 2, 3, 4, 5
}
Iterator Methods
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Iterator Methods ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā next() - Required. Returns { value, done } ā
ā return() - Optional. Called when iteration stops early (break) ā
ā throw() - Optional. Called to signal an error ā
ā ā
ā const iterator = { ā
ā next() { ā
ā return { value: 1, done: false }; ā
ā }, ā
ā return() { ā
ā console.log('Cleanup'); ā
ā return { done: true }; ā
ā } ā
ā }; ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Consuming Iterables
Constructs that use iterables:
- ā¢
for...ofloop - ā¢Spread operator
... - ā¢
Array.from() - ā¢Destructuring
- ā¢
Map(),Set(),WeakMap(),WeakSet() - ā¢
Promise.all(),Promise.race() - ā¢
yield*
Infinite Iterators
const infiniteCounter = {
[Symbol.iterator]() {
let n = 0;
return {
next() {
return { value: n++, done: false };
},
};
},
};
// Be careful - use with break or take first N
for (const num of infiniteCounter) {
if (num > 5) break;
console.log(num);
}
Summary
- ā¢Iterables have
[Symbol.iterator]()method - ā¢Iterators have
next()method - ā¢
next()returns{ value, done } - ā¢Many constructs consume iterables
- ā¢Custom iteration enables powerful patterns