new Set()
的安全代码可能如下所示:
let items = [];
for (let item of set)
if (isBad(item))
items.push(item);
for (let item of items)
set.delete(item)
我可以将代码简化为:
for (let item of set)
if (isBad(item))
set.delete(item);
new Map()
的安全代码可能如下所示:
let keys = [];
for (let [key, val] of map)
if (isBadKey(key) || isBadValue(val))
keys.push(key);
for (let key of keys)
map.delete(key)
我可以将代码简化为:
for (let [key, val] of map)
if (isBadJey(key) || isBadValue(val))
map.delete(key)
答案 0 :(得分:23)
是的,你可以简化,这是完全安全的。
从最后一点开始,唯一危险的事情就是
const s = new Set([1]);
for (let x of s) {
s.delete(x);
s.add(1);
}
但不是因为未定义的行为或内存累积,而是因为无限循环。
答案 1 :(得分:8)
我会说是的,这是安全的。当您使用引擎盖下的for ... of
迭代Set / Map时,循环将经历@@iterator。并且Iterator仅与.next()
一起操作:所以没有索引,也不管当前位置之前是什么。只有一个下一个元素很重要。
因此,除非在当前迭代器位置“之前”删除元素,否则可以安全地执行此操作。