A = { 1:1, 2:2, 3:3, 4:4, 5:5 };
for (var i in A) {
console.log(i);
if (A[i] == 4) delete A[i], A[7] = 7;
if (A[i] == 2) delete A[i], A[0] = 0;
if (A[i] == 7) console.log('seven');
if (A[i] == 0) console.log('zero');
}
console.log(A);
这似乎有效,但我不知道for(.. in ..)循环的实现细节,以确保它在大多数情况下都是安全的。
答案 0 :(得分:1)
According the MDN reference你不应该尝试这样做
如果在一次迭代中修改属性,然后在稍后访问 时间,它在循环中的值是它在以后的值。
在访问之前删除的属性不会 之后访问过。
添加到迭代所针对的对象的属性 可以从迭代中访问或省略发生的。
通常,最好不要添加,修改或删除对象的属性 在迭代期间,除了当前正在访问的属性。
无法保证是否会增加财产 访问过,是否修改过的属性(当前属性除外) 在修改之前或之后访问,或者是否删除 属性将在删除之前被访问。
因此,虽然到目前为止它可能在您的测试中起作用,但可能并非总是如此。
答案 1 :(得分:0)
通过使用该方法,您可能会跳过A
的索引,因为在删除元素时,所有其他元素的索引将移位-1,然后可能会被迭代器错过。相反,您可以创建第二个列表,然后只将A
的好值添加到它。