Estoy un poco confundido con el delete
operador 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, obj
es null
, pero foo
aún se refiere a un objeto exactamente igual obj
. Supongo que este objeto es el mismo objeto que foo
señaló.
Esto me confunde, porque esperaba que la escritura delete obj
eliminara el objeto que obj
apuntaba 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 verificarobj
eliminar el uso:delete obj.helloText
y luego verificarfoo now foo is an empty object
delete
no es para eliminar objetos en javascript.delete
Se 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.helloText
y puede ver quefoo
ahora 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
delete
palabra clave solo funciona para propiedades de un objeto, no para variables. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)El
delete
comando no tiene efecto en las variables regulares, solo en las propiedades. Después deldelete
comando, la propiedad no tiene el valornull
, no existe en absoluto.Si la propiedad es una referencia de objeto, el
delete
comando 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
x
variable se convierte en una propiedad delwindow
objeto global ydelete x;
realmente elimina lax
variable por completo.x
no será una variable adecuada en algunos navegadores, sino una propiedad en elwindow
objeto. 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
delete
no se utiliza para eliminar un objeto en Java Script.delete
utilizado para eliminar unobject key
en 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 !== undefined
porque"foo" in el
siempre 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
null
asegurarse 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 eldelete
comando, 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