所以我有一個情況,我有一個應該從數組返回值的生成器函數,但是數組正在填充在消耗生成器輸出的同一個循環中。如果在迭代過程中添加基礎集合,是否定義了數組迭代器的行爲?
具體場景是一個生成器,用於返回自動密鑰密碼的密鑰序列,其中每個新解碼的字符都附加到密碼密鑰的末尾。我的實現有效,但我不確定它是否能夠正常工作,或者這是一個未定義行爲的例子,它恰好對我有利。基本上,下面的代碼必須總是打印「a」,「b」,「c」,「d」,「e」,或者對於實現打印「a」,「b」 「c」,「undefined」,「undefined」?我總是很想修改一個正在迭代的集合。
let a = ["a", "b", "c"];
let iter = function*() { yield* a; }();
console.log(iter.next().value); // "a"
console.log(iter.next().value); // "b"
a.push("d");
a.push("e");
console.log(iter.next().value); // "c"
console.log(iter.next().value); // "d" - but is this guaranteed?
console.log(iter.next().value); // "e" - or is it?
編輯:從談論「發電機」改變了標題爲「迭代器」,以更準確地反映問題
我認爲你需要在你的生成器開始時複製一個a,然後''*'給拷貝。 – user949300
是的,ES6爲所有集合處理突變指定了@@ iterator()的行爲。 – Bergi