Answer

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
}

Report Page