При итерации свойств объекта безопасно ли удалять их в цикле for-in?
Например:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
Во многих других языках перебор массива или словаря и удаление внутри него небезопасно. Это нормально в JS?
(Я использую среду выполнения Mozilla Spidermonkey.)
javascript
loops
object
properties
Джо Шоу
источник
источник
Ответы:
В стандартном разделе 12.6.4 ECMAScript 5.1 (о циклах for-in) говорится:
Поэтому я думаю, что ясно, что код OP законен и будет работать, как ожидалось. Причуды браузера влияют на порядок итераций и операторы удаления в целом, но не на то, будет ли работать код OP. Обычно лучше всего удалять только текущее свойство в итерации - удаление других свойств в объекте непредсказуемо приведет к их включению (если они уже были посещены) или не включению в итерацию, хотя это может или не может быть проблемой в зависимости от ситуация.
Смотрите также:
Однако ничто из этого не влияет на код OP.
источник
Из спецификации Javascript / ECMAScript (в частности, 12.6.4 Заявление for-in ):
источник