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.