为什么URLSearchParams迭代器跳过每隔k,v对



考虑以下带有URLSearchParams迭代器的简单函数。

const foo = (qs) => {
const sp = new URLSearchParams(qs);
console.log(`pre: ${sp}`);
for (const [key, val] of sp.entries()) {
console.log(`'${key}: ${val}'`);
sp.delete(key);
}
console.log(`post: ${sp}`);
}
foo('a=1&b=2&c=3&d=4');

sp.delete(key)行注释掉后,输出

pre: a=1&b=2&c=3&d=4
'a: 1'
'b: 2'
'c: 3'
'd: 4'
post: a=1&b=2&c=3&d=4

但是当我取消注释该行时,输出是

pre: a=1&b=2&c=3&d=4
'a: 1'
'c: 3'
post: b=2&d=4

我希望所有的键都被删除,但在第二种情况下,迭代器跳过每一个其他的key,val对。为什么?我在哪里"愚蠢"?或";blind"我的错误?

注意:我意识到我在迭代它的时候改变了迭代器,但是我不能跳过每一个键

这是因为您正在修改底层数据结构(URLSearchParams对象),迭代器(用于…Of循环)正在使用。而且,当在循环中调用sp.delete(key)时,会导致迭代器跳过下一个键值对,因为当数据结构发生变化时,迭代器的内部状态会更新。

要解决这个问题,迭代条目的副本,即:

for (const [key, val] of Array.from(sp.entries())) {
console.log(`'${key}: ${val}'`);
sp.delete(key);
}

最新更新