我正在做这样的事情:

var myObj = {a:1, b:2, c:3, d:4};

for (var key in myObj){
  if (someCondition){
    delete(myObj[key]);
  }
}

在我尝试过的示例中,它工作得很好,但是我不确定在某些情况/浏览器中它是否可能具有意外行为。

可以修改要迭代的对象吗?

最佳答案

Section 12.6.4解释说for..in是根据“下一个属性”定义的:



由于即使在存在突变的情况下,“下一个属性”的概念也得到了很好的定义(尽管迭代顺序不是),所以迭代期间的delete不会引入未定义的行为。

在一个极端的情况下,delete取消了对原型(prototype)属性的屏蔽,如下所示:

var obj = Object.create({ x: 1 });
obj.y = 2;
obj.x = 3;
for (var k in obj) {
  if (k == 'y') { delete obj.x; }
  alert(k);
}

在这种情况下,您可能会迭代y并删除x,您仍然应该从原型(prototype)中看到x,但是如果您先迭代x,然后再迭代y,则您不应看到第二个x

10-04 22:05
查看更多