JS: Iterator

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, has property key "next" (own or inherited), and its value must be a function, and this function must return {done: boolean, value: value}.

Purpose of Iterator

Iterator basically serves as the mechanism to iterate over Iterable Object.

Iterator object is required as the return value of the function of property key Symbol.iterator of a Iterable Object .

Defining an Iterator

Here is a example of defining an iterator.

// create a 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 a Iterable with Given Iterator

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

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

// create a 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 a iterator with inherited key "next".

// create a 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 a iterator
const bb = Object.create(aa);

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

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

JavaScript. Iterable, Iterator