Разница между итератором и генератором в for цикла в JavaScript
Давайте иметь итератор и генератор, созданные для работы аналогичным образом.
По какой причине они ведут себя по-разному в for of
цикл, если он содержит оператор break или return?
Генератор завершен, а итератор все еще идет после окончания цикла.
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 ответ
Что происходит, когда
for of
цикл содержитbreak
или жеreturn
заявление?
Когда тело цикла завершается внезапно (с throw
или же return
заявление) или вырвано, IteratorClose
операция будет вызвана. Это в основном сводится к вызову итератора .return()
метод без аргументов, если у объекта итератора есть такой метод.
По какой причине итератор и генератор ведут себя по-разному?
Что только генератор имеет такой return()
метод. ArrayIterator
у созданного вами нет такого метода, так как он ничего не должен делать. Основная цель return()
Метод заключается в освобождении ресурсов, например, путем запуска finally
предложения в функции генератора, но итераторы массива не используют их. Он мог бы очистить свою ссылку на итеративный массив (который будет "закрывать" итератор), но это было сочтено ненужным, так как итераторы массива, как правило, сразу же собирают мусор.