JavaScript中循环的迭代器和生成器之间的区别

时间:2017-03-15 16:23:00

标签: javascript iterator generator for-of-loop

让我们创建一个迭代器和一个生成器,以便以类似的方式工作。

如果它包含break或return语句,它们在for of循环中的行为有什么不同?

生成器完成,而迭代器仍在循环结束后继续。

function *createGenerator() { 
  for ( let i=0; i<5; i++ ) {
    yield i;
  }
}

function createIterator() {
  const arr = [1, 2, 3, 4, 5];
  return arr[ Symbol.iterator ]();
}

function runForOfLoopOn( iterable ) {
  for ( const item of iterable ) {
    if ( item == 2 ) { 
      break;
    }
  }
}

const iterator = createIterator();
const generator = createGenerator();

runForOfLoopOn( iterator );
runForOfLoopOn( generator );

console.log( 'Iterator is done:', iterator.next().done );
console.log( 'Generator is done:', generator.next().done );

1 个答案:

答案 0 :(得分:2)

  

for of循环包含breakreturn语句时会发生什么?

当循环体突然完成(使用throwreturn语句)或被突破时,将调用IteratorClose operation。如果迭代器对象具有这样的方法,这基本上相当于调用迭代器的.return()方法而没有参数。

  

迭代器和生成器的行为有何不同?

只有生成器才有return() method。您创建的ArrayIterator没有这样的方法,因为它不需要做任何事情。 return()方法的主要目的是释放资源,例如通过在生成器函数中触发finally子句,但数组迭代器不使用任何子句。它可以清除它对迭代数组的引用(它将“关闭”迭代器),但这被认为是不必要的,因为数组迭代器通常是立即被垃圾收集。