Javascript:使用’for’删除正在迭代的对象的属性是否安全

前端之家收集整理的这篇文章主要介绍了Javascript:使用’for’删除正在迭代的对象的属性是否安全前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在做这样的事情:
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.

猜你在找的JavaScript相关文章