2017-03-15 17 views
1

同様に動作するようにイテレーターとジェネレーターを作成できます。JavaScript for forループの反復子とジェネレーターの相違点

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

for ofループがbreakまたはreturn文が含まれている場合はどうなりますか?

ループの本体(throwまたはreturn文で)突然完了するか、外に壊れている、IteratorClose operationが呼び出されます。これは、イテレータオブジェクトにそのようなメソッドがある場合、基本的に反復子の.return()メソッドを引数なしで呼び出すことになります。

イテレータとジェネレータが異なる動作をする理由は何ですか?

このようなものはreturn() methodです。作成したArrayIteratorには、実行する必要がないような方法はありません。 return()メソッドの主な目的は、リソースを解放することです。ジェネレータ関数内のfinally句をトリガしますが、配列イテレータは何も使用しません。 は、反復配列(iteratorを "閉じる")への参照をクリアすることができますが、通常、配列イテレータは通常すぐにガベージコレクションされるため、不要です。

+0

ありがとうございます。このような良い答えはすばやく期待できませんでした:)私はhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocolsでドキュメントを見てきました。イテレータの 'return'メソッドさて、あなたのおかげで、私はそれを知るでしょう:) –

関連する問題