Ответ
Чтобы сделать объект итерируемым, нужно реализовать метод [Symbol.iterator](), который возвращает итератор. Итератор — это объект с методом next(), возвращающим объект вида {value, done}.
Пример:
const myIterable = {
from: 1,
to: 5,
[Symbol.iterator]() {
let current = this.from;
const last = this.to;
return {
next() {
if (current <= last) {
return { value: current++, done: false };
}
return { done: true };
}
};
}
};
for (const num of myIterable) {
console.log(num); // 1, 2, 3, 4, 5
}
Ключевые моменты:
- Метод
[Symbol.iterator]должен возвращать объект-итератор - Итератор должен иметь метод
next() next()возвращает{value, done}до завершения итерации
Ответ 18+ 🔞
Да ты посмотри, что творят, блядь! Чтобы твою какую-то хрень можно было циклом for..of прогонять, как нормальный массив, надо ей внутрь воткнуть один специальный метод. Символ такой, [Symbol.iterator](), ёпта!
Суть в чём, блядь? Этот метод должен вернуть тебе объект-итератор. А итератор — это не абы что, это объект, у которого есть метод next(). И этот next() каждый раз, когда его дергают, выплёвывает результат: {value: твое_значение, done: false}. А когда всё кончилось, он говорит {done: true}. Всё, пиздец, итерация закончена.
Смотри, вот тебе живой пример, как это выглядит. Код не трогаю, он святой, блядь:
const myIterable = {
from: 1,
to: 5,
[Symbol.iterator]() {
let current = this.from;
const last = this.to;
return {
next() {
if (current <= last) {
return { value: current++, done: false };
}
return { done: true };
}
};
}
};
for (const num of myIterable) {
console.log(num); // 1, 2, 3, 4, 5
}
Видишь, что происходит, хитрая жопа? Создали объект myIterable с полями from и to. Внутри метода [Symbol.iterator]() замыкаем текущее значение и последнее. А потом возвращаем объектик с методом next(), который эти значения и выдаёт, пока не перевалит за to. И после этого наш for..of начинает это дело жрать, как будто так и надо!
Запомни три кита, блядь:
- Метод
[Symbol.iterator]()— он должен быть. Без него нихуя не получится. - Он возвращает объект-итератор.
- У этого итератора есть метод
next(), который и кормит всех данными, пока не кончится.
Вот и вся магия, ёбана! Не так страшен чёрт, как его малюют. Главное — начать, а там уже итерация покатится, как по маслу.