JavaScript for of 循环中迭代器和生成器的区别
Difference between iterator and generator in for of loop in JavaScript
让我们创建一个迭代器和一个生成器以类似地工作。
如果循环包含 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 );
What happens when a for of
loop contains a break
or return
statement?
当循环主体突然完成(使用 throw
或 return
语句)或被中断时,将调用 IteratorClose
operation。如果迭代器对象有这样的方法,这基本上相当于调用迭代器的 .return()
方法而不带参数。
What is the reason an iterator and a generator behave differently?
只有生成器有你创建的return()
method. The ArrayIterator
没有这样的方法,因为它不需要做任何事情。 return()
方法的主要目的是释放资源,例如通过在生成器函数中触发 finally
子句,但数组迭代器不使用任何子句。它 可以 清除它对迭代数组的引用(这将是 "closing" 迭代器),但这被认为是不必要的,因为数组迭代器通常会立即被垃圾收集。
让我们创建一个迭代器和一个生成器以类似地工作。
如果循环包含 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 );
What happens when a
for of
loop contains abreak
orreturn
statement?
当循环主体突然完成(使用 throw
或 return
语句)或被中断时,将调用 IteratorClose
operation。如果迭代器对象有这样的方法,这基本上相当于调用迭代器的 .return()
方法而不带参数。
What is the reason an iterator and a generator behave differently?
只有生成器有你创建的return()
method. The ArrayIterator
没有这样的方法,因为它不需要做任何事情。 return()
方法的主要目的是释放资源,例如通过在生成器函数中触发 finally
子句,但数组迭代器不使用任何子句。它 可以 清除它对迭代数组的引用(这将是 "closing" 迭代器),但这被认为是不必要的,因为数组迭代器通常会立即被垃圾收集。