Con una matriz de JavaScript, puedo restablecerlo a un estado vacío con una sola asignación:
array.length = 0;
Esto hace que la matriz "parezca" vacía y lista para reutilizarse, y hasta donde yo entiendo es una sola "operación", es decir, tiempo constante.
¿Hay una forma similar de borrar un objeto JS? Sé que puedo iterar sus campos eliminándolos:
for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }
Pero esto tiene una complejidad lineal.
También puedo tirar el objeto y crear uno nuevo:
obj = {};
Pero la creación "promiscua" de nuevos objetos genera problemas con Garbage Collection en IE6. ( Como se describe aquí )
javascript
performance
levik
fuente
fuente
for (var prop in obj)
Respuestas:
La respuesta corta a su pregunta, creo, es no (simplemente puede crear un nuevo objeto).
En este ejemplo, creo que establecer la longitud en 0 todavía deja todos los elementos para la recolección de basura.
Puede agregar esto a Object.prototype si es algo que usaría con frecuencia. Sí, es lineal en complejidad, pero cualquier cosa que no haga la recolección de basura más adelante lo será.
Esta es la mejor solución. Sé que no está relacionado con su pregunta, pero ¿por cuánto tiempo debemos continuar admitiendo IE6? Hay muchas campañas para descontinuar su uso.
Siéntase libre de corregirme si hay algo incorrecto arriba.
fuente
Bueno, a riesgo de hacer las cosas demasiado fáciles ...
... parece ser bastante efectivo para limpiar el objeto en una línea de código con un mínimo de paréntesis de miedo. Todos los miembros se eliminarán realmente en lugar de dejarse como basura.
Obviamente, si desea eliminar el objeto en sí, aún tendrá que hacer un delete () por separado para eso.
fuente
hasOwnProperty
en este bucle. He leído los documentos, pero todavía estoy tratando de entender cuáles son los riesgos, si los hay, si omitimos elhasOwnProperty()
cheque.ES5
La solución ES5 puede ser:
ES6
Y la solución ES6 puede ser:
Actuación
Independientemente de las especificaciones, las soluciones más rápidas generalmente serán:
La razón por la
for..in
que se debe realizar solo en objetos poco profundos o simples es que atraviesa las propiedades que se heredan prototípicamente, no solo las propiedades propias que se pueden eliminar. En caso de que no se sabe con certeza que un objeto es liso y propiedades son enumerables,for
conObject.getOwnPropertyNames
es una mejor opción.fuente
Puedes probar esto. La siguiente función establece todos los valores de las propiedades del objeto en indefinido. Funciona también con objetos anidados.
fuente
Para recapitular su pregunta: desea evitar, en la medida de lo posible, problemas con el error IE6 GC. Ese error tiene dos causas:
La solución para causar 1 parece ser: mantener baja la cantidad de asignaciones; Asigne nuevos objetos y cadenas lo menos posible.
La solución para causar 2 parece ser: mantener baja la cantidad de objetos 'vivos'; elimine sus cadenas y objetos tan pronto como ya no los necesite, y créelos nuevamente cuando sea necesario.
Hasta cierto punto, estas soluciones son contradictorias: mantener baja la cantidad de objetos en la memoria implicará más asignaciones y desasignaciones. Por el contrario, reutilizar constantemente los mismos objetos podría significar mantener más objetos en la memoria de los estrictamente necesarios.
Ahora para tu pregunta. Ya sea que restablezca un objeto creando uno nuevo o eliminando todas sus propiedades: eso dependerá de lo que quiera hacer con él después.
Probablemente quieras asignarle nuevas propiedades:
No hay una forma rápida y fácil de usar para borrar un objeto JScript para reutilizarlo como si fuera un objeto nuevo, sin crear uno nuevo. Lo que significa que la respuesta corta a su pregunta es 'No', como dice jthompson.
fuente
Algo nuevo en lo que pensar acerca de esperar a Object.observe en ES7 y con el enlace de datos en general. Considerar:
Entonces, bajo esa circunstancia, # 2 puede ser la mejor opción.
fuente
obj = {}
marco no se sabrá ningún cambio adicional al objeto, por lo tanto, sus plantillas no se representarán correctamente. Sin embargo, la opción n. ° 2 funcionará correctamente.Puede eliminar los accesorios, pero no elimine las variables.
delete abc;
es inválido en ES5 (y lanza con uso estricto).Puede asignarlo a nulo para configurarlo para su eliminación al GC (no lo hará si tiene otras referencias a propiedades)
Establecer la
length
propiedad en un objeto no cambia nada. (solo, bueno, establece la propiedad)fuente
length
en 0 en una matriz (que es un tipo específico de objeto; si no me cree, intente ejecutartypeof []
), no solo establecerá la propiedad, de hecho borrará el contenido de la matriz . Ver stackoverflow.com/questions/1232040/…window.abc
porque es un accesorio en ese caso.Esto me molestó durante años, así que aquí está mi versión, ya que no quería un objeto vacío, quería uno con todas las propiedades pero restablecer algunos valores predeterminados. Algo así como una nueva instanciación de una clase.
fuente