我正在做这样的事情:
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
是根据“下一个属性”定义的:
Let P be the name of the next property of obj whose [[Enumerable]] attribute is true. If there is no such property, return (normal, V, empty).
由于“下一个属性”的概念即使在存在突变的情况下也得到了很好的定义(尽管迭代顺序不是),因此迭代期间的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
。
关于Javascript:删除正在使用 'for' 迭代的对象的属性是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401492/