JS: Iterator Object

By Xah Lee. Date: . Last updated: .

(new in ECMAScript 2015)

What is iterator

An iterator is an object that conforms to the Iterator Interface.

Basically, it means the object has property key "next" (own or inherited), and its value is a function, and this function returns {done: boolean, value: value}.

Purpose of iterator

Iterator is the mechanism of how Iterable Object works.

for object to be an iterable object, it must have a property Symbol.iterator, and its value must be an iterator object.

when an iterable object is in an iterating context such as for-of Loop, the iterable object's iterator's property β€œnext” (value is a function) is used to generate values.

What is iterator-like object

Defining an iterator

Here is a example of defining an iterator.

// create an iterator

const xiterator = {};

xiterator.i = 0;

xiterator.next =
  () => ((xiterator.i < 3)
    ? { value: xiterator.i++, done: false }
    : { value: undefined, done: true });

// s------------------------------
// test

console.log(xiterator.next());
// { value: 0, done: false }

console.log(xiterator.next());
// { value: 1, done: false }

console.log(xiterator.next());
// { value: 2, done: false }

console.log(xiterator.next());
// { value: undefined, done: true }

Defining an iterable with given iterator

Here is a example of defining an iterable from an iterator.

// create an iterator
const xiterator = {};
xiterator.i = 0;
xiterator.next =
  () => ((xiterator.i < 3)
    ? { value: xiterator.i++, done: false }
    : { value: undefined, done: true });

// create an iterable
let xiterable = { [Symbol.iterator]: (() => xiterator) };

// s------------------------------

// test on iterable using spread operator

console.log(...xiterable);
// 0 1 2

Inherited key β€œnext”

Here is an example showing an iterator with inherited key "next".

// create an iterator
const aa = {};
aa.i = 0;
aa.next = () => ((aa.i < 3) ? { value: aa.i++, done: false } : { value: undefined, done: true });

// create object bb, with parent aa.
// bb is now also an iterator
const bb = Object.create(aa);

// create an iterable, using bb
let xiterable = { [Symbol.iterator]: () => bb };

// s------------------------------
// test on iterable using spread operator
console.assert(
 JSON.stringify([...xiterable]) === `[0,1,2]`,
);