问题是你的
iterateThis
函数返回
迭代器
但是
for/of
构造需要
可迭代的
.
好吧,等等,有什么区别?
从
MDN's page on iteration protocols
:
为了
可迭代的
,对象必须实现
@@iterator
方法,意味着对象(或其上的一个对象
原型链)必须具有
@ @迭代器
钥匙是什么
通过常量可用
Symbol.iterator
:
另一方面:
对象是
迭代器
当它实现
next()
方法与
以下语义:
ommited由于长度,tl;dr:下一个方法
返回窗体的对象:
{value: T, done: boolean}
他们有联系,打电话给
@ @迭代器
AN方法
可迭代的
返回一个
迭代器
.
这个
为/
循环总是需要iterable,因此如果您想使用
为/
,你必须使用
@ @迭代器
/
symbol.迭代器
. 据我所知,这是不可能的。但是,您的代码片段可以很容易地修改为使用它,只需创建一个对象,当
symbol.迭代器
方法被调用:
function iterateThis(arr){
let i = 0;
return {
next: function() {
return i < arr.length ?
{value: arr[i++], done: false} :
{done: true};
}
};
}
function makeIterableFromIterator(iterator) {
return {
[Symbol.iterator]: function() {
return iterator;
}
}
}
const iterator = iterateThis([1, 2, 3, 4, 5]);
const iterable = makeIterableFromIterator(iterator);
for (item of iterable) {
console.log(item);
}