Как стать автором
Обновить

Комментарии 5

184 итерирования слов "итератор | iterator" в статье, фактически целая страница — будто рекламная операция по итер… интеграции некоего бренда в головы потребителей. А так полезно, жду генерации перевода про генераторы

Если из подобных статей отжать всю воду, то справочник читать никто не будет.
Несколько раз упомянута фраза вида
Обратите внимание, что мы снова воспользовались вышеупомянутой хитростью: начали с -1, чтобы в первый раз вернуть 0.


Но так то если мы уж начинаем играть в хитрости то
next() {
        this.integer++;
        return { value: this.integer, done: false };
    },

проще было бы как
next() {
        return { value: this.integer++, done: false };
    },

и не нужно было бы начинать с -1, в данном случае в результат упадет 0, а следующее значение будет 1.

А ещё в примерах есть Object.entries, который мы используем чтобы получить ключи и значения сразу. Понятно что оно там для примера, но вообще оно само по себе является итератором и если надо сделать итерацию по ключам и значениям — можно в цикл сразу добавить

for (const a of Object.entries(OBJECT)) {
    console.log(a);
}

for (const [key, value] of Object.entries(OBJECT)) {
    console.log(key, value);
}

Второй пример с ходу с деструктуризацией.
Соответственные методы есть и для ключей и для значений отдельно.

Ещё заметьте что я использую в цикле const, но в статье везде упоминается let, хотя не представляю кейсов когда в цикле текущий элемент нужно было бы перезаписывать — он для того и берется новый каждый раз чтобы что-то с ним делать, разве что в кейсах типа stringVar = stringVar.slice(5,10), мол перезапиши мне то что было и продолжим. В остальных случаях лучше const.

Также существует способ делать итераторы для нормальных людей. Потому что через Symbol.iterator это такой, низкоуровневый, который не то чтобы имеет большие преимущества, просто он соединяет мир существующих коллекций и мир генераторов. Вот как раз про них и речь — если нужно создать что-то бесконечно там интерирующееся или как-то что-то подобное делающие — можно воспользоваться генераторами:


function * example () {
    yield 1;
    yield 10;
};

for (const item of example()) {
    console.log(item)
}



Генератор можно и в метод класса:


class X {
    *method() {
        yield 1000;
    }
}

for (item of new X().method()) {
    console.log(item)
}


Но если вам нужно чтобы прям экземпляр класса итерировался — тогда да — нужно взять один из способов в статье — возвращать объект с методом next и всем сопутствующим чтобы на каждый раз у нас был новый итератор или вернуть this и реализовать метод next внутри класса чтобы вызовы всегда продолжали текущее итерирование.
Но если вам нужно чтобы прям экземпляр класса итерировался

…то генератором можно сделать Symbol.iterator:


class X {
    *[Symbol.iterator]() {
        yield 1000;
    }
}

for (const item of new X()) {
    console.log(item)
}
Классная статья! Спасибо большущее! Очень надеюсь, что про генераторы выйдет как можно скорее и не менее доходчиво, ибо эта просто на 5+! Для меня генераторы всё ещё ккая-то непонятная часть жабаскрипта, которая, тем не менее кажется очень мощным инструментом, но непонятна сфера применения генераторов. Очень надеюсь, что идея написания не будет заброшена. Ешё раз выражаю большую благодарность за эту!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий