gpt4 book ai didi

javascript - 如果在迭代过程中添加了基础集合,是否定义了数组迭代器的行为?

转载 作者:行者123 更新时间:2023-11-29 21:11:57 24 4
gpt4 key购买 nike

所以我有这样一种情况,我有一个生成器函数,它应该从一个数组返回值,但是这个数组是在消耗生成器输出的同一个循环中填充的。

具体场景是生成器返回自动 key 密码的 key 序列,其中每个新解码的字符都附加到密码 key 的末尾。我的实现有效,但我不确定它是否保证有效,或者这是否是一个未定义行为的例子,恰好对我有利。

本质上,下面的代码必须始终打印“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?

已编辑:将标题从谈论“生成器”更改为“迭代器”以更准确地反射(reflect)问题的实质

最佳答案

根据 ES6 & Beyond,Kyle Simpson 着,p. 103,yield * 接受一个iterable,并“调用那个iterable 的迭代器”。因此,您实际上是在询问可迭代 行为,而不是生成器 行为。

我很难找到关于当底层数组被修改时数组的迭代器如何 react 的官方规范,但我必须假设这样一个基本特性是正确实现的——即,根据你的实验,新的数组元素被包含在可迭代的。当然,除非您使用的是 IE6。 :-)

因此,如果您希望您的生成器只包含 a[] 的原始元素,您必须复制一份。例如

let iter = function*(a) {
let copy = Array.from(a);
yield * copy;
}

关于javascript - 如果在迭代过程中添加了基础集合,是否定义了数组迭代器的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41390451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com