"La propiedad desapareció, pero el objeto permaneció": ¿cómo eliminar algo innecesario en JavaScript?
\n\nImagina una situación: estás trabajando con un objeto grande que llegó del servidor. Tiene 20 campos, pero solo se necesitan 15 para enviar un formulario. O estás escribiendo una función que debe devolver datos sin un campo de servicio _id. ¿Qué hacer? La pregunta más popular en Stack Overflow sobre este tema ha obtenido cientos de miles de visitas, y no es casualidad.
Eliminar una propiedad de un objeto es una de esas tareas que parecen triviales pero esconden varias sorpresas. En este artículo, desglosaremos todas las formas principales de eliminar una propiedad de un objeto en JavaScript, compararemos su rendimiento y mutabilidad, y descubriremos qué enfoque elegir en 2025.
\n\nMétodo #1: El operador delete — Un clásico
\n\nLa forma más obvia e históricamente primera es usar el operador delete. Elimina permanente e irrevocablemente una propiedad de un objeto.
const user = {\n name: 'Anna',\n email: 'anna@example.com',\n password: 'super_secret_123'\n};\n\ndelete user.password;\n\nconsole.log(user);\n// { name: 'Anna', email: 'anna@example.com' }\nconsole.log(user.password); // undefined\n\n\n¿Cómo funciona realmente delete?
\n\nEl operador delete no solo asigna undefined. Elimina completamente la propiedad del objeto. Puedes verificar esto usando el método hasOwnProperty:
const car = { brand: 'Tesla' };\nconsole.log(car.hasOwnProperty('brand')); // true\n\ndelete car.brand;\nconsole.log(car.hasOwnProperty('brand')); // false\n\n\nUna diferencia importante: después de delete, la propiedad deja de existir. No aparecerá durante la iteración con for...in o Object.keys().
¿Cuándo no funcionará delete?
\n\nHay varias "trampas":
\n\n- \n
- No puedes eliminar propiedades declaradas con var/let/const. El operador
deletesolo funciona con propiedades de objetos. \n - Las propiedades heredadas del prototipo no se eliminan, solo las propiedades propias. \n
- Las propiedades con la bandera configurable: false (por ejemplo, en objetos integrados) no se eliminan. En modo estricto, esto generará un error. \n
// Ejemplo: una propiedad con configurable: false\nconst obj = {};\nObject.defineProperty(obj, 'fixed', {\n value: 42,\n configurable: false\n});\n\ndelete obj.fixed; // false (no eliminada)\nconsole.log(obj.fixed); // 42\n\n\nMétodo #2: Destructuración y el operador Rest — Un enfoque moderno
\n\nSi trabajas con datos inmutables (y en JavaScript moderno esto se considera una buena práctica), entonces delete podría no ser la mejor opción, ya que muta el objeto original. Una alternativa es crear un nuevo objeto sin la propiedad no deseada usando destructuración:
const user = {\n name: 'Ivan',\n email: 'ivan@example.com',\n role: 'admin',\n token: 'abc123'\n};\n\n// Elimina el campo token creando un nuevo objeto\nconst { token, ...userWithoutToken } = user;\n\nconsole.log(userWithoutToken);\n// { name: 'Ivan', email: 'ivan@example.com', role: 'admin' }\nconsole.log(user.token); // 'abc123' — ¡el objeto original no se modifica!\n\n\nEste enfoque es especialmente popular en el desarrollo con React, cuando necesitas pasar solo un subconjunto de props a un componente, excluyendo campos de servicio.
\n\nPros y Contras de la Destructuración
\n\n- \n
- + Inmutabilidad: el objeto original permanece sin cambios. Esto es importante para Redux, Vuex y la programación funcional. \n
- + Legibilidad: es visualmente claro qué campos estamos excluyendo. \n
- - Rendimiento: se crea una copia del objeto, lo que puede ser costoso para objetos grandes. \n
- - Incómodo para eliminar muchas propiedades: si necesitas eliminar 5 campos de 20,