【发布时间】:2016-12-30 04:04:17
【问题描述】:
所以我有一个生成器函数应该从数组返回值的情况,但是该数组被填充在消耗生成器输出的同一个循环中。
具体场景是生成器返回自动密钥密码的密钥序列,其中每个新解码的字符都附加到密码密钥的末尾。我的实现有效,但我不确定它是否能保证有效,或者这是否是恰好对我有利的未定义行为示例。
本质上,下面的代码必须始终打印“a”、“b”、“c”、“d”、“e”,或者实现打印“a”、“b”、“ c”、“未定义”、“未定义”?我总是对修改正在迭代的集合持怀疑态度。
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 ,然后将
yield *复制到副本中。 -
是的,ES6 为所有集合指定了
@@iterator()的行为来处理突变。
标签: javascript iterator generator