如何解决迭代时修改Javascript集合
是否有正式定义,说明在迭代集合时修改集合时Javascript集合迭代器应如何表现?例如,数组迭代器似乎无法处理拼接,而映射迭代器可以处理删除。在Chrome上进行了测试。
let array = ["a","b","c"];
for (let item of array)
{
console.log(item); // Writes a,c,d
if (item === "a") array.splice(0,1);
if (item === "c") array.push("d");
}
let map = new Map();
map.set("a","A");
map.set("b","B");
map.set("c","C");
for (let [key,item] of map)
{
console.log(key); // Writes a,b,d
if (key === "a") map.delete("a");
if (key === "c") map.set("d","D");
}
解决方法
在这些情况下,代码基本上可以按预期运行,但是有时很难准确了解正在进行的读取/更新顺序。
看看下面的代码片段-它仍然是您的代码,但标记了更多日志记录。您会在每一步上看到发生了什么,我认为这应该使您更清楚地知道获得结果的原因。
let array = ["a","b","c"];
let i = 0;
for (let item of array)
{
console.log("[iterator item: " + item + "] [iterator value " + i +"] [current array:",array + "]");
if (item === "a") {array.splice(0,1);console.log("spliced 1 item after reading: " + item);}
if (item === "c") {array.push("d"); console.log("pushed 1 item after reading: " + item)};
i++;
}
console.log(array);
let map = new Map();
map.set("a","A");
map.set("b","B");
map.set("c","C");
for (let [key,item] of map)
{
console.log("iterated over key: " + key); // Writes a,b,c,d
if (key === "a") {map.delete("a"),console.log("deleted a")};
if (key === "c") {map.set("d","D"),console.log("iterated over key c and added a new map set for d-D")};
}
console.log(mapEntriesToString(map));
function mapEntriesToString(entries) {
return Array
.from(entries,([k,v]) => `\n ${k}: ${v}`)
.join("") + "\n";
}
,
如果您真的想深入了解此内容,那么您首先应该查看ECMAScript 2020 spec或您的钱包所需的任何其他版本。然后,当了解lang规范对数组的工作方式时,可以转到下一步并选择符合该规范的引擎。 V8作为Chrome和Node.js中使用的示例
您可以在v8 source code中自己查看迭代器的实现。
因此,您将如何全面了解任何语言的任何功能
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。