JS: Iterator
(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