02. Iterators
Итераторы являются общим стандартном передачи данных между источником данных и их получателем.
Источник данных реализует итератор.
Потребитель данных ожидает итератор для получения данных.
В этом смысле итераторы в ES6 формируют протокол (интерфейс и множество правил его использования).
Iterable object
Объект является итерируемым, если на нем определен Symbol.iterator. При вызове метода Symbol.iterator перебираемый объект, реализующий протокол итератора.
Интерфейс итератора:
interface Iterable {
[System.iterator]() : Iterator;
}
interface Iterator {
next() : IteratorResult;
return?(value? : any) : IteratorResult;
throw()
}
interface IteratorResult {
value: any;
done: boolean;
}Правила итератора:
Вызов
Symbol.iteratorдолжен возвращать новый итератор на каждый свой вызов.Итератор должен возвращать данные последовательно.
Итератор должен возвращать по одному объекту за раз.
Iterator protocol
По стандарту у объекта итератора должен быть метод next(), который при каждом вызове возвращает объект следующей структуры { value: any, done: boolean}
value— очередное значение,done— равноfalse, если есть ещё значения, иtrue— в конце.
Итерация прекращается когда возвращается объект с {done: true}. Это последний шаг итерации. При стандартном алгоритме итерации, значение, возвращаемое на последнем шаге игнорируется.
Привет простого итератора:
const iterable = {
[Symbol.iterator]() {
let step = 0;
const iterator = {
next() {
if (step <= 2) {
step++;
}
switch (step) {
case 1:
return { value: "hello", done: false };
case 2:
return { value: "world", done: false };
default:
return { value: undefined, done: true };
}
}
};
return iterator;
}
};
for (const x of iterable) {
console.log(x);
}
// Output:
// hello
// worldВозможны и бесконечные итераторы. Нет никаких ограничений на next, он может возвращать всё новые и новые значения, и это нормально.
Last updated
Was this helpful?