Copia profunda vs superficial: trampas de JSON.parse y stringify
2025-03-19
Si necesitas una copia editable sin tocar el original, JSON.parse(JSON.stringify(obj)) funciona para JSON plano. Pero en cuanto aparecen Date, funciones o ciclos, llegan las sorpresas.
Copia superficial vs profunda
Spread y Object.assign solo copian el primer nivel; los objetos anidados siguen compartidos.
El viaje JSON solo conserva valores serializables en JSON.
Que se pierde en el camino
undefined, funciones y claves Symbol desaparecen; Date se convierte en texto ISO y deja de ser instancia Date.
Map, Set y RegExp se degradan; NaN e Infinity no se preservan correctamente.
const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }Las referencias circulares fallan
Si un objeto se referencia a si mismo, stringify lanza Converting circular structure to JSON.
Para grafos, usa structuredClone o un recorrido con WeakMap.
Cuando gana structuredClone
En navegadores modernos y Node 17+ conserva Date, Map, Set, RegExp y ciclos.
Aun no clona funciones, nodos DOM ni metodos de prototipo.
Como elegir
Para payloads JSON puros de API, el round-trip JSON sigue siendo la opcion mas ligera.
Si hay fechas, mapas o ciclos, usa structuredClone; para grafos complejos de clases, cloneDeep.