Czy podczas iteracji po właściwościach obiektu można je bezpiecznie usunąć w pętli for-in?
Na przykład:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
W wielu innych językach iterowanie po tablicy lub słowniku i usuwanie wewnątrz jest niebezpieczne. Czy w JS jest w porządku?
(Używam środowiska uruchomieniowego Spidermonkey Mozilli).
javascript
loops
object
properties
Joe Shaw
źródło
źródło
Odpowiedzi:
ECMAScript 5.1 norma rozdział 12.6.4 (na pętli for-in) mówi:
Myślę więc, że jest jasne, że kod OP jest legalny i będzie działał zgodnie z oczekiwaniami. Dziwactwa przeglądarki mają wpływ na kolejność iteracji i ogólne instrukcje usuwania, ale nie na to, czy kod OP będzie działał. Generalnie najlepiej jest usunąć tylko bieżącą właściwość w iteracji - usunięcie innych właściwości w obiekcie w nieprzewidywalny sposób spowoduje, że zostaną one uwzględnione (jeśli zostały już odwiedzone) lub nie zostaną uwzględnione w iteracji, chociaż może to lub nie, w zależności od sytuacja.
Zobacz też:
Żadne z nich nie wpływa jednak tak naprawdę na kod OP.
źródło
Ze specyfikacji Javascript / ECMAScript (konkretnie 12.6.4 Instrukcja for-in ):
źródło