JS: Iterator

By Xah Lee. Date: . Last updated: .

(new in JS: 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 });

// HHHH------------------------------
// 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) };

// HHHH------------------------------

// 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) };

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

JavaScript. Iterable, Iterator