Итераторы являются общим стандартном передачи данных между источником данных и их получателем.
Источник данных реализует итератор.
Потребитель данных ожидает итератор для получения данных.
В этом смысле итераторы в ES6 формируют протокол (интерфейс и множество правил его использования).
Iterable object
Объект является итерируемым, если на нем определен Symbol.iterator. При вызове метода Symbol.iterator перебираемый объект, реализующий протокол итератора.
Вызов Symbol.iterator должен возвращать новый итератор на каждый свой вызов.
Итератор должен возвращать данные последовательно.
Итератор должен возвращать по одному объекту за раз.
Iterator protocol
По стандарту у объекта итератора должен быть метод next(), который при каждом вызове возвращает объект следующей структуры { value: any, done: boolean}
value — очередное значение,
done — равно false, если есть ещё значения, и true — в конце.
Итерация прекращается когда возвращается объект с {done: true}. Это последний шаг итерации. При стандартном алгоритме итерации, значение, возвращаемое на последнем шаге игнорируется.
Привет простого итератора:
Возможны и бесконечные итераторы. Нет никаких ограничений на next, он может возвращать всё новые и новые значения, и это нормально.