InterviewHubPRO
Section Overview
Q502

Question 502 of 521

Part 8: Modern JavaScript APIs, WeakRef, Proxy & Performance (464 - 521)

96%
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]