2015-06-14 44 views
0
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 ..)循环的细节,以确保它在大多数情况下是安全的。修改(..in ..)循环中的对象是否安全?

See also here the same question about arrays.

+0

http://es5.github.io/#x12.6.4 – Teemu

回答

1

According the MDN reference你不应该试图如果财产是一个迭代修改,然后在以后的时间 访问做这个

,其在循环值是其在以后的时间价值。

在访问之前被删除的属性将不会在稍后访问 。

添加到迭代为 的对象中添加的属性可以在迭代中访问或省略。

一般来说,最好不要在迭代期间添加,修改或删除对象 中的属性,而不是当前正在访问的属性。

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

所以虽然它可能在你的测试中工作到目前为止它可能并不总是。

0

通过使用该方法,因为当你删除元素,你可能会跳过的A指标,所有其他元素的索引将被转移-1,并且随后通过迭代错过。相反,您可以创建第二个列表,然后仅向A添加好值。

相关问题