我正在做这样的事情:
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
。