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语句):
枚举期间可以删除要枚举的对象的属性.如果删除枚举期间尚未访问的属性,则不会访问该属性.如果在枚举期间将新属性添加到要枚举的对象,则无法保证在活动枚举中访问新添加的属性.在任何枚举中不得多次访问属性名称.