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

Joe*_*haw 89 javascript loops properties object

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

例如:

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

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}
Run Code Online (Sandbox Code Playgroud)

在许多其他语言中迭代数组或字典并删除内部不安全.在JS中可以吗?

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

Tom*_*omW 103

ECMAScript的5.1标准节12.6.4(上,中环路)说:

枚举期间可以删除要枚举的对象的属性.如果删除枚举期间尚未访问的属性,则不会访问该属性.如果在枚举期间将新属性添加到要枚举的对象,则无法保证在活动枚举中访问新添加的属性.在任何枚举中不得多次访问属性名称.

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

也可以看看:

但这些都不会影响OP的代码.


Chi*_*ill 16

Javascript/ECMAScript规范(特别是12.6.4 for-in语句):

枚举期间可以删除要枚举的对象的属性.如果删除枚举期间尚未访问的属性,则不会访问该属性.如果在枚举期间将新属性添加到要枚举的对象,则无法保证在活动枚举中访问新添加的属性.在任何枚举中不得多次访问属性名称.