¿Cómo borrar rápidamente un objeto JavaScript?

Resuelto levik asked hace 15 años • 11 respuestas

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í )

levik avatar Mar 26 '09 12:03 levik
Aceptado

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.

Wytze avatar Feb 26 '2013 12:02 Wytze

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..inse 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, fores Object.getOwnPropertyNamesuna mejor opción.

Estus Flask avatar Dec 03 '2016 23:12 Estus Flask

Creo que la respuesta corta a su pregunta es no (simplemente puede crear un nuevo objeto).

  1. En este ejemplo, creo que establecer la longitud en 0 aún deja todos los elementos para la recolección de basura.

  2. 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á.

  3. 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.

jthompson avatar Mar 26 '2009 05:03 jthompson