¿Cómo borrar rápidamente un objeto JavaScript?
Con una matriz JavaScript, puedo restablecerla a un estado vacío con una sola asignación:
array.length = 0;
Esto hace que la matriz "parezca" vacía y lista para ser reutilizada y, hasta donde tengo entendido, es una "operación" única, es decir, tiempo constante.
¿Existe 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 complejidad lineal.
También puedo tirar el objeto y crear uno nuevo:
obj = {};
Pero la creación "promiscua" de nuevos objetos genera problemas con la recolección de basura en IE6. ( Como se describe aquí )
Bueno, a riesgo de poner las cosas demasiado fáciles...
for (var member in myObject) delete myObject[member];
...parecería ser bastante efectivo para limpiar el objeto en una línea de código con un mínimo de corchetes aterradores. Todos los miembros serán realmente eliminados en lugar de quedar como basura.
Obviamente, si desea eliminar el objeto en sí, aún tendrá que realizar una eliminación () por separado para eso.
ES5
La solución ES5 puede ser:
// for enumerable and non-enumerable properties
Object.getOwnPropertyNames(obj).forEach(function (prop) {
delete obj[prop];
});
ES6
Y la solución ES6 puede ser:
// for enumerable and non-enumerable properties
for (const prop of Object.getOwnPropertyNames(obj)) {
delete obj[prop];
}
Actuación
Independientemente de las especificaciones, las soluciones más rápidas suelen ser:
// for enumerable and non-enumerable of an object with proto chain
var props = Object.getOwnPropertyNames(obj);
for (var i = 0; i < props.length; i++) {
delete obj[props[i]];
}
// for enumerable properties of shallow/plain object
for (var key in obj) {
// this check can be safely omitted in modern JS engines
// if (obj.hasOwnProperty(key))
delete obj[key];
}
La razón por la que for..in
se debe realizar solo en objetos planos o poco profundos 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 sepa con certeza si un objeto es simple y las propiedades son enumerables, for
es Object.getOwnPropertyNames
una mejor opción.
Creo que la respuesta corta a su pregunta es no (simplemente puede crear un nuevo objeto).
En este ejemplo, creo que establecer la longitud en 0 aún deja todos los elementos para la recolección de basura.
Podrías agregar esto a Object.prototype si es algo que usarías con frecuencia. Sí, tiene una complejidad lineal, pero cualquier cosa que no realice recolección de basura más adelante lo será.
Esta es la mejor solución. Sé que no está relacionado con tu pregunta, pero ¿durante cuánto tiempo debemos seguir admitiendo IE6? Hay muchas campañas para suspender su uso.
No dudes en corregirme si hay algo incorrecto arriba.