JS: Iterator Object
(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]`, );