Безопасно ли удалять свойство объекта во время итерации по ним?


при повторении свойств объекта безопасно ли удалять их в цикле for-in?

например:

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

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

во многих других языках итерация по массиву или словарю и удаление внутри этого небезопасно. Это нормально в JS?

(я использую среду выполнения SpiderMonkey от Mozilla.)

2 81

2 ответа:

The стандарт ECMAScript 5.1 раздел 12.6.4 (на петлях for-in) говорит:

свойства перечисляемого объекта могут быть удалены во время перечисления. Если собственность то, что еще не было посещено во время перечисления, удаляется, тогда оно не будет посещено. Если новые свойства добавленные к перечисляемому объекту во время перечисления, вновь добавленные свойства не гарантируются в активных перечисления. Имя свойства должно быть не посещайте более одного раза в любом перечислении.

поэтому я думаю, что ясно, что код OP является законным и будет работать так, как ожидалось. Причуды браузера влияют на порядок итераций и инструкции delete в целом, но не на то, будет ли работать код OPs. Обычно лучше всего удалить только текущее свойство в итерации-удаление других свойств в объекте непредсказуемо приведет к их включению (если они уже посещены) или не включены в итерацию, хотя это может или может не быть проблемой в зависимости от ситуации.

Читайте также:

однако ни один из них не влияет на код OP.

с спецификация Javascript/ECMAScript (особенно 12.6.4 оператор for-in):

свойства перечисляемого объекта могут быть удалены во время перечисление. Если свойство, которое еще не было посещено во время перечисление удаляется, после чего оно не будет посещено. Если новые свойства добавляются к перечисляемому объекту во время перечисления,Ново добавленные свойства не гарантированы для посещения в активном режиме перечисление. Имя свойства не должно быть посещено более одного раза в любом перечисление.