假设我们有以下生成器:
var gen = function* () {
for (var i = 0; i < 10; i++ ) {
yield i;
}
};
如何以最有效的方式循环遍历迭代器?
目前我通过手动检查done
属性是否设置为true
var item
, iterator = gen();
while (item = iterator.next(), !item.done) {
console.log( item.value );
}
假设我们有以下生成器:
var gen = function* () {
for (var i = 0; i < 10; i++ ) {
yield i;
}
};
如何以最有效的方式循环遍历迭代器?
目前我通过手动检查done
属性是否设置为true
var item
, iterator = gen();
while (item = iterator.next(), !item.done) {
console.log( item.value );
}
迭代任何可迭代对象(支持@@iterator的对象),最好的方法是使用for..of
,如下所示
'use strict';
function * gen() {
for (var i = 0; i < 10; i++) {
yield i;
}
}
for (let value of gen()) {
console.log(value);
}
或者,如果你想要一个数组,你可以使用Array.from
来实现,像这样:
console.log(Array.from(gen());
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
const value of gen()
会触发错误(SyntaxError: invalid for/in left-hand side)。使用let value of gen()
即可。 - Frédéric Hamidilet
被识别的必要条件。在“普通”JavaScript模式下,既不支持const value of
,也不支持let value of
(但支持var value of
)。 - Frédéric Hamidiconst
和for..of
。或者我可能对JS1.7的实现感到困惑。 - CodingIntrigue在这个问题中,一个自包含的、单行的替代while循环的方法是for循环。对于纯粹的副作用或消耗迭代的特殊情况,而不是在结束时对结果进行处理,我们可以避免绑定下一个项目值,然后在for-of解决方案中不使用它:
for (let n = iterator.next(); !n.done; n = iterator.next()) {}
iterator.next().value
和iterator.next().done
,所以它应该是item().value
和item().done
。 - Sabaz