Итераторы
Итератор в JavaScript — объект, который позволяет обращаться к элементам коллекции по одному за раз, отслеживая своё текущее положение внутри последовательности.
Для того, чтобы объект был итерируемым, в нём должен быть реализован
метод итератора, доступный через свойство [Symbol.iterator]. Этот метод
не принимает аргументов и должен возвращать объект, соответствующий протоколу
итератора.
Если объект является итерируемым, с ним можно использовать цикл for..of
и оператор spread. Некоторые встроенные типы (Array, Map, Set и др.)
являются итерируемыми.
Протокол итератора
Объект является итератором, если в нем определён метод next, реализующий
следующую логику.
Метод возвращает объект с двумя свойствами: done и value.
done:true, если итератор достиг конца, в этом случае свойствоvalueможет определять возвращаемое значение итератораfalse, если итератор может генерировать следующее значение последовательности; отсутствие свойства эвквивалентноfalse
value: любое JavaScript значение, возвращаемое итератором; может быть опущено, если done имеет значениеtrue
Опционально у итератора может быть метод return, который может принимать
аргумент и использоваться для явного завершения итерации и возврата заданного
значения. Данный метод должен возвращать объект с такой же логикой, как и метод
next.
Пример
class MyRange implements Iterable<number>, Iterator<number> { public readonly from: number; public readonly to: number; private current: number; constructor(from: number, to: number) { this.from = from; this.to = to; } public [Symbol.iterator](): Iterator<number> { this.current = this.from; return this; } public next(): IteratorResult<number> { if (this.current <= this.to) { return {value: this.current++}; } else { return {done: true}; } } }
const range = new MyRange(0, 4); const values = [...range]; // [0, 1, 2, 3, 4] for (const value of range) console.log(value); // 0 1 2 3 4