JavaScript Internals (521 Qs)•Part 8: Modern JavaScript APIs, WeakRef, Proxy & Performance (464 - 521)
What is the purpose of Symbol.iterator and how do you use it?
Symbol.iterator is a well-known symbol that specifies the default iterator for an object, making it iterable with for...of loops and spread operators.
javascript
// Built-in iterables use Symbol.iterator
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
Creating custom iterables:
javascript
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let current = this.start;
const end = this.end;
return {
next() {
if (current <= end) {
return { value: current++, done: false };
}
return { done: true };
}
};
}
}
const range = new Range(1, 5);
for (const num of range) {
console.log(num); // 1, 2, 3, 4, 5
}
console.log([...range]); // [1, 2, 3, 4, 5]
Using generator function:
javascript
class Countdown {
constructor(start) {
this.start = start;
}
*[Symbol.iterator]() {
for (let i = this.start; i >= 0; i--) {
yield i;
}
}
}
const countdown = new Countdown(5);
console.log([...countdown]); // [5, 4, 3, 2, 1, 0]
Practical example - infinite sequence:
javascript
const fibonacci = {
[Symbol.iterator]() {
let prev = 0, curr = 1;
return {
next() {
[prev, curr] = [curr, prev + curr];
return { value: prev, done: false };
}
};
}
};
// Get first 10 fibonacci numbers
const fib10 = [];
for (const num of fibonacci) {
fib10.push(num);
if (fib10.length === 10) break;
}
console.log(fib10); // [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]