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

标签 javascript

我正在做这样的事情:

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/

相关文章:

javascript - Bluemix 单点登录不显示登录页面

javascript - 为什么 jQuery 事件在外部就绪函数时不触发,即使在文档准备好之后?

javascript - HTML5视频标签-如何设置封面背景大小

javascript - 如何仅使用按钮而不是整行拖放?

javascript - ng-repeat 中的 Angular 搜索不起作用

javascript - 我的 addthis 工具箱 J​​avaScript 小部件在移动设备上不存在

javascript - 替换直 Angular 括号

Javascript:全局上下文和函数上下文声明

javascript - DataTable分页后无法点击按钮

javascript - MongoDB 引用不保存 (Mongoose)