Al iterar sobre las propiedades de un objeto, ¿es seguro eliminarlas en un bucle for-in?
Por ejemplo:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
En muchos otros lenguajes, iterar sobre una matriz o diccionario y eliminarlo dentro no es seguro. ¿Está bien en JS?
(Estoy usando el tiempo de ejecución Spidermonkey de Mozilla).
javascript
loops
object
properties
Joe Shaw
fuente
fuente
Respuestas:
La sección 12.6.4 estándar de ECMAScript 5.1 (sobre bucles for-in) dice:
Entonces, creo que está claro que el código del OP es legal y funcionará como se esperaba. Las peculiaridades del navegador afectan el orden de iteración y las declaraciones de eliminación en general, pero no si el código de OP funcionará. En general, es mejor eliminar solo la propiedad actual en la iteración: eliminar otras propiedades en el objeto hará que de manera impredecible se incluyan (si ya se visitaron) o no se incluirán en la iteración, aunque eso puede o no ser una preocupación según el situación.
Ver también:
Sin embargo, ninguno de estos afecta realmente el código del OP.
fuente
De la especificación Javascript / ECMAScript (específicamente 12.6.4 La declaración for-in ):
fuente