从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
方法的对象?
在调用生成器函数时,我们是否获得了既是迭代器又是可迭代对象的对象?这是如何完成的?
答案 0 :(得分:2)
简而言之,是的,生成器既是可迭代的,又是迭代器。
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