修改(..in ..)循环中的数组是否安全?

时间:2015-06-14 17:10:43

标签: javascript

A = [1,2,3,4,5];
for (var i in A) {
    if (A[i] == 4) A.splice(i,1), A.push(7);
    if (A[i] == 2) A.splice(i,1), A.push(0);
    if (A[i] == 7) console.log('seven');
    if (A[i] == 0) console.log('zero');
}
console.log(A);

这似乎有效,但我不知道for(.. in ..)循环的实现细节,以确保它在大多数情况下都是安全的。

See also the paired question about an object modification

1 个答案:

答案 0 :(得分:0)

在您获胜的意义上更改对象是非常安全的,并且浏览器会抱怨对阵列的任何更改。请注意,在您的示例中,如果您看到"七,零",只是"七",只是"零"或者什么都没有,它仍然是有效的行为一直在打印。

一方面,浏览器必须确保在访问之前删除的属性不会被枚举。另一方面,浏览器可以自由地使用:

  • 枚举新属性或让它们脱离循环
  • 按任何顺序枚举属性。

这就是为什么在依赖索引/顺序时使用for ... in来迭代数组不是安全的原因。索引被视为可枚举属性,并且可以使用与对象属性相同的机制进行枚举(其中迭代顺序没有预期)。