Javascript-迭代器混乱

时间:2020-05-23 10:26:11

标签: javascript arrays iterator

在此简单代码中,console.log(names.next().value);(如果被调用两次,则增加数组索引)。我不确定它的操作方式,因为我认为它应该始终以0开头,因此应该返回相同的值。

有人可以解释它是如何做到的吗?

// Iterator Example
function nameIterator(names) {
  let nextIndex = 0;
  console.log(nextIndex);

  return {
    next: function() {
      return nextIndex < names.length ? {
        value: names[nextIndex++],
        done: false
      } : {
        done: true
      }
    }
  }
}

// Create an array of names
const namesArr = ['Brad', 'Sara', 'John'];
// Init iterator and pass in the names array
const names = nameIterator(namesArr);

console.log(names.next().value);
console.log(names.next().value);
console.log(names.next().value);
console.log(names.next());

输出:

Brad
Sara
John
Object : {done: true}

3 个答案:

答案 0 :(得分:1)

这是因为代码中的以下行。

names[nextIndex++]

此行选择names值中的索引,然后将nextIndex的值加1,但仅在选择键之后。在下面的示例中看到它,以查看其输出。

let arr = [1, 2, 3];
let index = 0;

console.log(arr[index++]);
console.log(arr[index++]);
console.log(arr[index++]);
因此,每次您调用nextIndex方法时next()都会递增,并且一直持续到nextIndex的值达到阈值为止。

答案 1 :(得分:1)

这是因为next()使用了nextIndex函数中存在的nameIterator()属性。

next()本身没有nextIndex属性的单独副本。因此,当您在nextIndex++方法中执行next()时,它实际上会更新nextIndex中我们拥有的nameIterator(),并且下次您调用next()时,只会访问此更新的nextIndex

答案 2 :(得分:1)

每次调用函数next时,它的索引都会增加1 -> nextIndex++

您可以传递一个标志,指示您想要当前的索引值,如下所示:

// Iterator Example
function nameIterator(names) {
  let nextIndex = 0;
  return {
    next: function(current) {      
      let index;
      if (current) {
        index = (nextIndex < names.length ? nextIndex : names.length) - 1;
      } else {
        index = nextIndex++;
      }
      
      return index < names.length ? {
        value: names[index],
        done: false
      } : {
        done: true
      }
    }
  }
}

// Create an array of names
const namesArr = ['Brad', 'Sara', 'John'];
// Init iterator and pass in the names array
const names = nameIterator(namesArr);

console.log(names.next().value);
console.log(names.next(true).value);
console.log(names.next(true).value);
console.log(names.next(true).value);
console.log(names.next().value);
console.log(names.next(true).value);
console.log(names.next().value);
console.log(names.next());
console.log(names.next(true).value);
console.log(names.next());

相关问题