Протокол iterator определяет стандартный способ создания последовательности значений в JavaScript. Он состоит из двух ключевых частей: объекта-итератора и итерируемого объекта.
Объект является итератором, когда он реализует метод next(), который возвращает объект ровно с двумя свойствами:
value — текущее значение в последовательностиdone — булево значение, указывающее, завершена ли последовательность{ value: someValue, done: false } // ещё идёт итерация
{ value: undefined, done: true } // последовательность завершена
Объект является итерируемым, когда он определяет метод [Symbol.iterator](), который возвращает итератор. Это позволяет использовать объект в циклах for...of, синтаксисе spread и деструктуризации.
JavaScript предоставляет несколько встроенных итерируемых объектов из коробки:
ArrayStringMapSetТы можешь сделать любой пользовательский объект итерируемым, реализовав протокол вручную:
const range = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
const last = this.to;
return {
next() {
return current <= last
? { value: current++, done: false }
: { value: undefined, done: true };
}
};
}
};
for (const num of range) {
console.log(num); // 1, 2, 3
}
Протокол iterator предоставляет единый интерфейс для последовательного доступа к данным. Реализовав [Symbol.iterator](), любой пользовательский объект получает полную совместимость со встроенными механизмами итерации в JavaScript: for...of, spread (...) и деструктуризацией.
Объект итератора должен реализовать как метод next(), так и метод [Symbol.iterator](), чтобы правильно соответствовать протоколу итератора.
Новый — ещё не проверен сообществом
Вы