如何循环来自生成器的JavaScript迭代器?

hsz*_*hsz 5 javascript iterator generator ecmascript-6

我们假设我们有以下生成器:

var gen = function* () {
  for (var i = 0; i < 10; i++ ) {
    yield i;
  }
};
Run Code Online (Sandbox Code Playgroud)

循环遍历迭代器的最有效方法是什么?目前我是手动检查done属性是否设置true:

var item
  , iterator = gen();

while (item = iterator.next(), !item.done) {
  console.log( item.value );
}
Run Code Online (Sandbox Code Playgroud)

the*_*eye 7

迭代任何iterable(一个支持@@ iterator的对象)的最佳方法是使用for..of,就像这样

'use strict';

function * gen() {
    for (var i = 0; i < 10; i++) {
        yield i;
    }
}

for (let value of gen()) {
    console.log(value);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要一个数组,那么你可以Array.from像这样使用

console.log(Array.from(gen());
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Run Code Online (Sandbox Code Playgroud)


Rob*_*era 7

while问题中循环的一个独立的单行替代方案是for循环。对于纯粹的副作用或耗尽的迭代的特殊情况,我们避免了绑定下一个项目值,然后不在解决方案中使用它的问题,而不是在最后对结果做一些事情for-of

for (let n = iterator.next(); !n.done; n = iterator.next()) {}
Run Code Online (Sandbox Code Playgroud)