Comments 13
Дополнительным плюсом будет тот факт, что у нас появляются другие возможности итераторов. Например, можно очень просто преобразовать наш range в массив:
Преобразование в массив это не эксклюзивная фишка генераторов.
Ничто не мешает преобразовать в массив и итератор из второго примера:
function range(from, to, step = 1){
    return {
        [Symbol.iterator](){
            return {
                current: from,
                to: to,
                from: from,
                step,
                next(){
                    const it = { done: this.current >= this.to, value: this.current }
                    this.current += this.step
                    return it
                }
            }
        }
    }
}
console.log([...range(0, 10)])


Последний пример можно ещё упростить и просто объявить генератор. Вместо
function range(from, to, step = 1){
    return {
        *[Symbol.iterator](){
            for(let val = from; val < to; val += step){
                yield val;
            }
        }
    }
}
можно
function* range(from, to, step = 1){
    for(let val = from; val < to; val += step){
        yield val;
    }
}

Да. Возможно я неправильно выразился, но я вовсе не хотел указывать, что это особенность генераторов.
Спасибо, что указали на последний пример. Кажется я слишком увлекся символами и совсем не подумал об очевидном применении генератора.

Всегда можно ещё проще!

function* range(from, to, step = 1) {
    while (from < to) {
        yield from;
        from += step;
    }
}


И да, ладно, что нет проверок, что входные данные — это числа. Тут будут проблемы с отрицательным step ещё.

Надо бы проверить, что все параметры являются числами. Или преобразовать их в числа при помощи унарного плюса.


Потому что со строками функция range работает совершенно логичным, но не соответствующим своему названию образом.

А на Бабеле написать квадратные скобочки с поддержкой двоеточий внутри слабо?

С удовольствием посмотрим Вашу реализацию :)
Тем не менее, хотел бы отметить, что синтаксис [1..10] в JS невалиден, поскольку выкинет SyntaxError: Unexpected number из-за того, что это по сути попытка получить атрибут «10» числа «1.» — на это может намекнуть строка «15..toString(2)»
Ну дык на то и бабель — чтобы в итоге это был не JS. Про двоеточия я имел в виду не только [1..10], но и arr[:2]. Вообще, меня удручает, что бабеля так мало в реальных проектах, ну вот я бы, например, обрадовался оператору |> для замены функции pipe() в RxJS

Он там уже почти пять лет в пропозалах, из них почти 3 года в stage 1.

Только учтите, что перейдя на TypeScript вы начнёте его судорожно отовсюду выпиливать. Т.е. оно полностью ломает его, даже при выводе типов из js-файлов.

Для сравнения приведу питонокод со всем синтаксическим сахаром и без него:

for i in range(1, 10):
    print(i)


range_iter = range(1, 10).__iter__()

while True:
    try:
        value = range_iter.__next__()
        print(value)
    except StopIteration:
        break
Only those users with full accounts are able to leave comments. Log in, please.