JavaScript Iterators
The iterator protocol defines how to produce a sequence of values from an object.
An object becomes an iterator when it implements a next() method.
The next() method must return an object with two properties:
value (the next value)
done (true or false)
value The value returned by the iterator
(Can be omitted if done is true)
done true if the iterator has completed
false if the iterator has produced a new value