Javascript 在对象属性上进行迭代时删除对象属性是否安全?
迭代对象的属性时,在for-in循环中删除它们是否安全 例如: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 (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的代码。我已经开始悬赏这个问题,因为我认为当前的答案不充分,不能回答所提出的问题。还请包括相关来源(希望来自规范)和任何值得注意的浏览器“怪癖”,如果适用。我刚刚注意到我包括了与其他答案相同的标准引用,抱歉。