在迭代对象属性时删除它们是否安全?

在对对象的属性进行迭代时,在 for-in 循环中删除它们是否安全?

例如:

for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;


if (shouldDelete(obj[key])) {
delete obj[key];
}
}

在许多其他语言中,迭代数组或字典并删除其中的内容是不安全的。JS 可以吗?

(我使用的是 Mozilla 的蜘蛛猴运行时。)

21901 次浏览

Javascript/ECMAScript specification(特别是 12.6.4 for-in 声明) :

枚举对象的属性可能会在 枚举 enumeration is deleted, then it will not be visited. If new properties 将添加到枚举期间枚举的对象中,新增 < em > 添加的属性不能保证在活动的 枚举 。在任何 枚举。

ECMAScript 5.1标准章节12.6.4(for-in 循环)说:

枚举对象的属性可能在枚举期间被删除 如果在枚举期间尚未访问过的属性被删除,则不会访问该属性 添加到枚举期间枚举的对象中时,不能保证新添加的属性 属性名称在任何枚举中不得被访问超过一次。

因此,我认为很明显,OP 的代码是合法的,并将按预期工作。浏览器异常通常会影响迭代顺序和删除语句,但不会影响 OP 代码是否能正常工作。通常最好只删除迭代中的当前属性——删除对象中的其他属性将不可预测地导致它们被包含(如果已经访问过)或者不包含在迭代中,尽管这可能是一个问题,也可能不是一个问题,这取决于具体情况。

参见:

但是这些都不会真正影响 OP 的代码。