Estoy un poco confundido con el deleteoperador de JavaScript . Tome el siguiente código:
var obj = {
    helloText: "Hello World!"
};
var foo = obj;
delete obj;Después de que este fragmento de código se haya ejecutado, objes null, pero fooaún se refiere a un objeto exactamente igual obj. Supongo que este objeto es el mismo objeto que fooseñaló.
Esto me confunde, porque esperaba que la escritura delete objeliminara el objeto que objapuntaba en la memoria, no solo la variable obj.
Se debe esto a la basura de JavaScript Collector está trabajando en una base retener / liberación, por lo que si no tuviera ninguna otra variable que apunta al objeto, que podría ser eliminado de la memoria?
(Por cierto, mi prueba se realizó en Safari 4.)
                    
                        javascript
                                pointers
                                object
                                memory-management
                                garbage-collection
                                
                    
                    
                        Steve Harrison
fuente
                
                fuente

var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;objeto no se elimina verificarobjeliminar el uso:delete obj.helloTexty luego verificarfoo now foo is an empty objectdeleteno es para eliminar objetos en javascript.deleteSe utiliza para eliminar una clave de objeto. En su casovar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;, el objeto no se elimina. Compruebeobj. A continuación, ejecutedelete obj.helloTexty puede ver quefooahora apunta a un vacío objeto. "" "Respuestas:
El operador de eliminación elimina solo una referencia, nunca un objeto en sí. Si eliminó el objeto en sí, otras referencias restantes estarían colgando, como una eliminación de C ++. (Y acceder a uno de ellos provocaría un bloqueo. Hacer que todos se vuelvan nulos significaría tener un trabajo adicional al eliminar o memoria adicional para cada objeto).
Dado que Javascript es basura recolectada, no es necesario eliminar los objetos ellos mismos; se eliminarán cuando ya no haya forma de referirse a ellos.
Puede ser útil eliminar referencias a un objeto si ha terminado con él, porque esto le da al recolector de basura más información sobre lo que se puede reclamar. Si las referencias permanecen a un objeto grande, esto puede causar que no se reclame, incluso si el resto de su programa en realidad no usa ese objeto.
fuente
deletepalabra clave solo funciona para propiedades de un objeto, no para variables. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;window?var)El
deletecomando no tiene efecto en las variables regulares, solo en las propiedades. Después deldeletecomando, la propiedad no tiene el valornull, no existe en absoluto.Si la propiedad es una referencia de objeto, el
deletecomando elimina la propiedad pero no el objeto. El recolector de basura se encargará del objeto si no tiene otras referencias.Ejemplo:
(Probado en Firefox).
fuente
xvariable se convierte en una propiedad delwindowobjeto global ydelete x;realmente elimina laxvariable por completo.xno será una variable adecuada en algunos navegadores, sino una propiedad en elwindowobjeto. Por supuesto, esto es un problema con la consola y no refleja cómo se ejecuta normalmente el código.Las "variables declaradas implícitamente" son propiedades del objeto global, por lo que eliminar funciona en ellas como funciona en cualquier propiedad. Las variables declaradas con var son indestructibles.
fuente
let.Viniendo de la documentación de Mozilla, "puede usar el operador de eliminación para eliminar las variables declaradas implícitamente pero no las declaradas con la declaración var".
Aquí está el enlace: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
fuente
deleteno se utiliza para eliminar un objeto en Java Script.deleteutilizado para eliminar unobject keyen su casoel objeto no se elimina, compruebe que obj todavía tome los mismos valores, elimine el uso:
y luego verifica
obj, foo, ambos son objeto vacío.fuente
Acabo de encontrar un jsperf que puede considerar interesante a la luz de este asunto. (podría ser útil mantenerlo para completar la imagen)
Compara eliminar , establecer nulo y establecer indefinido .
Pero tenga en cuenta que prueba el caso cuando elimina / establece la propiedad muchas veces.
fuente
Además de las preguntas de GC, para el rendimiento uno debe considerar las optimizaciones que el navegador puede estar haciendo en segundo plano ->
http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
Parece que puede ser mejor anular la referencia que eliminarla, ya que eso puede cambiar la `` clase '' detrás de escena que usa Chrome.
fuente
IE 5 a 8 tiene un error en el que el uso de eliminar en las propiedades de un objeto host (Window, Global, DOM, etc.) arroja TypeError "el objeto no admite esta acción".
Más adelante, si necesita verificar dónde la propiedad tiene un significado, use el valor completo
el.foo !== undefinedporque"foo" in elsiempre devolverá verdadero en IE.Si realmente necesita que la propiedad realmente desaparezca ...
si necesita usar el objeto host con la api host ...
fuente
Me topé con este artículo en mi búsqueda de esta misma respuesta. Lo que terminé haciendo es extraer
obj.pop()todos los valores / objetos almacenados en mi objeto para poder reutilizar el objeto. No estoy seguro si esta es una mala práctica o no. Esta técnica me fue útil para probar mi código en las herramientas de Chrome Dev o FireFox Web Console.fuente
Esto funciona para mí, aunque no es una buena práctica. Simplemente elimina todo el elemento asociado al que pertenece el objeto.
fuente
Establecer una variable para
nullasegurarse de romper cualquier referencia a objetos en todos los navegadores, incluidas las referencias circulares que se hacen entre los elementos DOM y los ámbitos de Javascript. Al usar eldeletecomando, estamos marcando los objetos que se borrarán en la próxima ejecución de la recolección de elementos no utilizados , pero si hay varias variables que hacen referencia al mismo objeto, eliminar una sola variable NO LIBERARÁ el objeto, simplemente eliminará el vínculo entre esa variable y el objeto. Y en la próxima ejecución de la recolección de basura, solo se limpiará la variable.fuente