Javascript 在对象属性上进行迭代时删除对象属性是否安全?

Javascript 在对象属性上进行迭代时删除对象属性是否安全?,javascript,loops,object,properties,Javascript,Loops,Object,Properties,迭代对象的属性时,在for-in循环中删除它们是否安全 例如: for (var key in obj) { if (!obj.hasOwnProperty(key)) continue; if (shouldDelete(obj[key])) { delete obj[key]; } } 在许多其他语言中,迭代数组或字典并在其中删除是不安全的。用JS可以吗 (我正在使用Mozilla的Spidermonkey运行时。)来自(特别是): 正在枚举的对象

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

例如:

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

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}
在许多其他语言中,迭代数组或字典并在其中删除是不安全的。用JS可以吗

(我正在使用Mozilla的Spidermonkey运行时。)

来自(特别是):

正在枚举的对象的属性可能会在过程中被删除 枚举。如果在期间未访问过的财产 枚举已删除,则不会访问它。如果有新的属性 添加到枚举期间枚举的对象中,新 添加的属性不保证在活动中访问 枚举。每次访问属性名称不得超过一次 枚举

第12.6.4节(关于in-loops)规定:

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

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

另见:


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

我已经开始悬赏这个问题,因为我认为当前的答案不充分,不能回答所提出的问题。还请包括相关来源(希望来自规范)和任何值得注意的浏览器“怪癖”,如果适用。我刚刚注意到我包括了与其他答案相同的标准引用,抱歉。