修改(..in ..)循环内的对象是否安全?

时间:2015-06-14 17:16:36

标签: javascript

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 ..)循环的实现细节,以确保它在大多数情况下都是安全的。

See also here the same question about arrays.

2 个答案:

答案 0 :(得分:1)

According the MDN reference你不应该尝试这样做

  

如果在一次迭代中修改属性,然后在稍后访问   时间,它在循环中的值是它在以后的值。

     

在访问之前删除的属性不会   之后访问过。

     

添加到迭代所针对的对象的属性   可以从迭代中访问或省略发生的。

     

通常,最好不要添加,修改或删除对象的属性   在迭代期间,除了当前正在访问的属性。

     

无法保证是否会增加财产   访问过,是否修改过的属性(当前属性除外)   在修改之前或之后访问,或者是否删除   属性将在删除之前被访问。

因此,虽然到目前为止它可能在您的测试中起作用,但可能并非总是如此。

答案 1 :(得分:0)

通过使用该方法,您可能会跳过A的索引,因为在删除元素时,所有其他元素的索引将移位-1,然后可能会被迭代器错过。相反,您可以创建第二个列表,然后只将A的好值添加到它。