生成器是否同时返回迭代器和可迭代器?

时间:2018-06-21 17:28:27

标签: javascript iterator iterable

this question I asked before中我了解到chmod a+x run.sh期望可迭代,即

  

一个实现for...of方法的对象,这意味着该对象(或其原型链中的一个对象)必须具有一个带有@@iterable键的属性,可以通过常量{{1 }}

所以,一个可迭代的对象看起来像这样:

@@iterator

另一方面,我们有生成器,如下所示:

Symbol.iterator

并且可以在const iterableObject: { [Symbol.iterator]: function someIteratorFunction() { //... } } 这样的结构中使用:

function* generatorFoo(){
  yield 1;
  yield 2;
  yield 3;
  yield 4;
}

因此,调用for...of将返回一个可迭代对象,因为for(const item of generatorFoo()) console.log(item); 对其进行处理没有问题。我还可以调用generatorFoo()并收到一个迭代器,以确认这一点。

但是,调用for...of也会返回一个迭代器,因为我可以调用generatorFoo()[Symbol.iterator]()来获取对象,该对象带有方法generatorFoo来获取迭代器的下一个值,如下所示:< / p>

generatorFoo()

这是否意味着调用生成器函数会返回可以访问next方法 const iteratorFromGen = generatorFoo(); iteratorFromGen.next().value; //1 iteratorFromGen.next().value; //2 iteratorFromGen.next().value; //3 iteratorFromGen.next().value; //4 方法的对象?

在调用生成器函数时,我们是否获得了既是迭代器又是可迭代对象的对象?这是如何完成的?

1 个答案:

答案 0 :(得分:2)

简而言之,是的,生成器既是可迭代的,又是迭代器。

From MDN

  

Generator对象由generator函数返回,并且它   符合可迭代协议和迭代器协议。

通过调用返回的生成器对象的Symbol.iterator方法返回的迭代器与生成器对象本身相同。例如:

function* gen() {
  let i = 0;
  while (i < 10) yield i++;
}

const iterableIterator = gen();
console.log(iterableIterator === iterableIterator[Symbol.iterator]()); // true

您甚至可以通过遵循迭代器协议并使用返回Symbol.iterator的{​​{1}}方法,很容易地复制该模式。例如:

this