From 这个问题我之前问过 https://stackoverflow.com/questions/50917742/can-i-make-an-iterator-with-a-simple-function-no-generator-or-symbol-iterator我了解到for...of
期望一个可迭代的,即
一个实现了@@iterable
方法,这意味着该对象(或其原型链上的对象之一)必须具有一个带有@@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
还会返回一个迭代器,因为我可以调用generatorFoo()
我得到一个带有方法的对象next
获取迭代器的下一个值,如下所示:
const iteratorFromGen = generatorFoo();
iteratorFromGen.next().value; //1
iteratorFromGen.next().value; //2
iteratorFromGen.next().value; //3
iteratorFromGen.next().value; //4
这是否意味着调用生成器函数会返回一个可以访问next
method and a [Symbol.iterator]
方法?
当调用生成器函数时,我们是否得到一个既是迭代器又是可迭代对象的对象?这是如何实现的?