Skip to main content
JavaScript & the browser·Module C6 · Lesson 3
TaskBuild a countdown object with property from = 3 implementing Symbol.iterator so for (const n of countdown) yields 3, 2, 1. Log each value using for-of, then log [...countdown] (spread).

The iterator protocol

150 XP10 min
Theory

What makes something iterable

A value is iterable if it has a method at the special key Symbol.iterator that returns an iterator object. An iterator has a .next() method that returns { value, done }.

const arr = [10, 20, 30];
const it = arr[Symbol.iterator]();
console.log(it.next()); // { value: 10, done: false }
console.log(it.next()); // { value: 20, done: false }
console.log(it.next()); // { value: 30, done: false }
console.log(it.next()); // { value: undefined, done: true }

for-of and the spread operator both call [Symbol.iterator]() under the hood.

Building your own iterable

Any object with the right shape becomes iterable:

const range = {
  from: 1,
  to: 3,
  [Symbol.iterator]() {
    let current = this.from;
    const end = this.to;
    return {
      next() {
        return current <= end
          ? { value: current++, done: false }
          : { value: undefined, done: true };
      },
    };
  },
};

for (const n of range) console.log(n); // 1, 2, 3
[...range];                              // [1, 2, 3]

This is the cheap-and-explicit version. Lesson C6-04 shows the same thing with much less ceremony using generators.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 15 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.