2011-07-21 11 views
5

Soy un programador C/C++/Java que trabaja con JavaScript.Javascript 'eliminar' no funciona dentro del ciclo iterativo

Estoy intentando escribir una función que eliminará todas las propiedades de un objeto 'obj'. He leído la publicación en "How to quickly clear a Javascript Object?" y vi que hay dos respuestas: (1) crear un nuevo 'obj' (que no quiero hacer porque mi código es un programa de alto rendimiento que se ejecuta en un navegador móvil) , y quiero minimizar la recolección de basura); y (2) iterar sobre las propiedades de un objeto en un bucle y eliminar las propiedades. Este último enfoque no funciona en Chrome 12.

Considere el siguiente código:

var foo = {}; 
foo['baz'] = 'bar'; 
console.log("1. foo.baz = " + foo.baz); 

delete foo.baz; 
console.log("2. foo.baz = " + foo.baz); 

foo['baz'] = 'bar'; 
console.log("3. foo.baz = " + foo.baz); 

for (prop in foo) 
{ 
    if (foo.hasOwnProperty(prop)) 
    { 
     console.log("deleting property " + prop); 
     delete foo.prop; 
    } 
} 
console.log("4. foo.baz = " + foo.baz); 

Esto produce el siguiente resultado en mi consola en Chrome 12:

1. foo.baz = bar 
2. foo.baz = undefined 
3. foo.baz = bar 
deleting property baz 
4. foo.baz = bar 

Por qué no funciona foo.baz obtener eliminado dentro del bucle?

Respuesta

8

usted buscar el key en el camino equivocado. Es necesario utilizar la notación soporte:

delete foo[ prop ]; 

Sin embargo, no es necesario para recorrer todas las propiedades dentro de un objeto. Está bien que null la referencia del objeto en sí. El recolector de basura cuidará de ti.

foo = null; // done 

Hablando de alto rendimiento, esa es la forma en que desea hacer.

+0

(1) Tenía la impresión de que la notación de propiedad foo.prop y foo [prop] eran equivalentes, por ejemplo, como se menciona en http://www.jibbering.com/faq/faq_notes/square_brackets.html. (2) ¿Por qué funciona "delete foo.baz" en mi ejemplo? (3) Como mencioné, quiero minimizar la recolección de basura ya que estoy trabajando en un navegador móvil. – stackoverflowuser2010

+0

'foo.prop' es equivalente a' foo ["prop"] '. ¿ver la diferencia? Si desea extraer dinámicamente una propiedad de 'foo', debe usar' foo [prop] '. – digitalbath

+0

@ stackoverflowuser2010: Pondría más fe en el GC. Si no crea una tonelada de objetos en cada clic, debería estar bien. ¡Eliminar explícitamente todas las propiedades y luego agregar nuevas puede tomar más tiempo que simplemente crear una nueva y dejar la anterior en el GC! – delnan

3

Esta línea delete foo.prop es incorrecta. foo no tiene ninguna propiedad llamada prop en este caso. Usando los soportes delete foo[prop].

+0

Hmm. Me pregunto por qué esto fue votado negativamente. No veo nada malo con eso en particular. – Reid

+0

Me pregunté a mí mismo. Creo que alguien estaba celoso de mi respuesta rápida. ;) – Joe

0

Porque foo.prop nunca se definió para eliminar. Es necesario eliminar de esta manera:

delete foo[prop]; 
0

probar este lugar:

delete foo[prop]; 

HTH

Cuestiones relacionadas