Функция генератора в javascript - PullRequest
2 голосов
/ 22 апреля 2020

Я новичок в javascript и не могу понять такое поведение функции генератора. Почему он выводит только нечетные числа (1,3,5,7,9)?

function* numberGen(n){
    for (let i=0;i<n;i++){
        yield i
    }
}

const num = numberGen(10)
while (num.next().value!=undefined){
    console.log(num.next().value)
}

Ответы [ 3 ]

5 голосов
/ 22 апреля 2020

Вы звоните num.next() дважды в каждой итерации. Вы вызываете его один раз в заголовке while(), чтобы проверить, не является ли результат неопределенным, затем вы вызываете его второй раз в теле, чтобы записать значение. Каждый вызов извлекает следующий элемент из генератора. Таким образом, вы проверяете четные элементы на null и регистрируете нечетные элементы после него.

Вместо этого вам следует присвоить переменную одному вызову

function* numberGen(n){
    for (let i=0;i<n;i++){
        yield i
    }
}

const num = numberGen(10)
let i;
while ((i = num.next().value) !== undefined){
    console.log(i)
}

Вместо явного вызова метода .next() можно использовать встроенный метод итерации for-of.

function* numberGen(n) {
  for (let i = 0; i < n; i++) {
    yield i
  }
}

const num = numberGen(10)
for (let i of num) {
  console.log(i);
}
3 голосов
/ 22 апреля 2020

Вы вызываете .next() дважды за итерацию, следовательно, вы пропускаете все остальные номера.

1 голос
/ 22 апреля 2020

в операторе проверки условий while вы используете одно из двух значений только для проверки, итераторы являются расходуемыми, и поэтому мы просто видим нечетные числа, четные числа использовались для достоверных проверок

function* numberGen(n){
    for (let i=0;i<n;i++){
        yield i
    }
}

const num = numberGen(10);

//using spread opertaor to iterate all values
console.log([...num]);

//or you can use forOf 
//for( number of num ){
//  console.log(number);
//}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...