从我之前提出的这个问题中,我了解到for...of
期望一个可迭代对象,也就是说,该对象(或其原型链中的一个对象)必须具有带有@@iterator
键的属性,该属性可以通过常量Symbol.iterator
获得。
因此,可迭代对象看起来应该像这样:
实现
@@iterable
方法的对象。
所以,一个可迭代对象应该长这样:
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
方法和[Symbol.iterator]
方法的权限?
调用生成器函数时,我们是否获得既是迭代器又是可迭代的对象?这是如何实现的?