我正在做这样的事情:
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).
由于即使在存在突变的情况下也很好地定义了“下一个属性”这个概念(虽然迭代顺序不是),但迭代期间的删除不会引入未定义的行为.
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,你仍然应该看到原型中的x,但如果先迭代x,那么你不应该看到第二个x.