Answer
t.me/js_testОтвет:
const range = {
from: 1,
to: 5,
[Symbol.iterator]() {
return {
current: this.from,
last: this.to,
next() {
if (this.current < this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
},
};
Обьяснение:
Для того чтобы сделать объект итерируемым (и позволить for..of работать с ним), нужно добавить метод с именем Symbol.iterator. Когда цикл запускается вызывается этот самый метод который обязательно должен возвращать объект с методом next. Далее на каждую итерацию вызывается именно метод next. Ну и внутри next должен возвращать объект вида {done: boolean, value: any}, соответственно когда вернётся объект с полем done равном true цикл закончится.
Код для проверки:
const range = {
from: 1,
to: 5,
[Symbol.iterator]() {
return {
current: this.from,
last: this.to,
next() {
if (this.current < this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
},
};
for (const num of range) {
console.log(num); // 1, 2, 3, 4
}