Безопасно ли удалять свойство объекта во время итерации по ним?
при повторении свойств объекта безопасно ли удалять их в цикле for-in?
например:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
во многих других языках итерация по массиву или словарю и удаление внутри этого небезопасно. Это нормально в JS?
(я использую среду выполнения SpiderMonkey от Mozilla.)
2 ответа:
The стандарт ECMAScript 5.1 раздел 12.6.4 (на петлях for-in) говорит:
свойства перечисляемого объекта могут быть удалены во время перечисления. Если собственность то, что еще не было посещено во время перечисления, удаляется, тогда оно не будет посещено. Если новые свойства добавленные к перечисляемому объекту во время перечисления, вновь добавленные свойства не гарантируются в активных перечисления. Имя свойства должно быть не посещайте более одного раза в любом перечислении.
поэтому я думаю, что ясно, что код OP является законным и будет работать так, как ожидалось. Причуды браузера влияют на порядок итераций и инструкции delete в целом, но не на то, будет ли работать код OPs. Обычно лучше всего удалить только текущее свойство в итерации-удаление других свойств в объекте непредсказуемо приведет к их включению (если они уже посещены) или не включены в итерацию, хотя это может или может не быть проблемой в зависимости от ситуации.
Читайте также:
- MDN on for..in
- MDN в браузере причуды re: порядок итерации
- в глубине страницы по вопросам удаления оператора
однако ни один из них не влияет на код OP.
с спецификация Javascript/ECMAScript (особенно 12.6.4 оператор for-in):
свойства перечисляемого объекта могут быть удалены во время перечисление. Если свойство, которое еще не было посещено во время перечисление удаляется, после чего оно не будет посещено. Если новые свойства добавляются к перечисляемому объекту во время перечисления,Ново добавленные свойства не гарантированы для посещения в активном режиме перечисление. Имя свойства не должно быть посещено более одного раза в любом перечисление.