for循环期间修改Javascript关联数组

for循环期间修改Javascript关联数组,javascript,foreach,associative-array,Javascript,Foreach,Associative Array,javascriptfor关键字将迭代对象的所有属性。如果在循环体中修改对象,会发生什么 例如,下面的代码可以吗 for(var key in obj) if (whatever(obj[key])) delete obj[key]; 如果该代码以确定的方式工作,并且最好是对obj中的所有键都进行一次精确测试,那么就可以了。相比之下,在.NET或Java中,类似的构造通常会抛出异常。我认为它是可行的。只需小心地询问hasOwnProperty(key)——因为for也会

javascript
for
关键字将迭代对象的所有属性。如果在循环体中修改对象,会发生什么

例如,下面的代码可以吗

for(var key in obj)
    if (whatever(obj[key]))
        delete obj[key];

如果该代码以确定的方式工作,并且最好是对
obj
中的所有键都进行一次精确测试,那么就可以了。相比之下,在.NET或Java中,类似的构造通常会抛出异常。

我认为它是可行的。只需小心地询问
hasOwnProperty(key)
——因为
for
也会愉快地迭代继承的属性(和方法,它们只是带有函数值的属性)

还有:说:

注意:for…in循环主体中的代码对每个属性执行一次

还有:说:

for…in循环以任意顺序对对象的属性进行迭代(有关为什么不能依赖于迭代的表面顺序的更多信息,请参阅delete操作符,至少在跨浏览器设置中是如此)。如果在一次迭代中修改了一个属性,然后在以后的时间访问该属性,则循环公开的值将是该属性在以后的时间的值。在访问之前被删除的属性以后将不会被访问。添加到正在进行迭代的对象中的属性可以访问,也可以从迭代中忽略。一般来说,最好不要在迭代过程中添加、修改或删除对象的属性,当前正在访问的属性除外;无法保证是否会访问添加的属性、是否会在修改之前或之后访问已修改的属性,或者是否会在删除之前访问已删除的属性


我从这里读到的是-如果你修改的是当前值以外的值,不确定性可能会咬你的屁股。但是,修改当前值应该没问题。

我不认为
delete
操作符不会从原型中删除属性。它仅删除直接存在于被引用对象上的属性,并且仅当其内部“DontDelete”标志未设置时才删除。(当然有些浏览器中有bug。)@Pointy:我同意这一点。我只是懒惰,这是第一个结果(一直如此:()。我也给了MDC信息,这更详细地解释了问题。也感谢一个好的链接。不客气-这不是严厉的批评,只是一种“社区意识”的东西:-)伟大的MDC页面,谢谢!即使在修改其他键时,实现听起来也不错;毕竟,密钥删除后将不会被访问。因此,虽然顺序本身是不确定的(很好),但无论实际顺序如何,已经访问过的键都不会再次访问,而尚未访问的键仍然会被访问(新添加的道具也可能是)。换句话说,如果您接受非确定性排序,那么其余的就完全可以了,并且做了您所期望的事情。太好了@阿玛丹,事实上这句话并没有提到改变价值是好的。除非有一份EMCA参考文件明确指出这是可以的,否则风险太大了。浏览器可能会做一些奇怪的优化工作,导致内存泄漏。