考虑以下带有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);
}