Copia profunda vs superficial: armadilhas de JSON.parse e stringify
2025-03-19
Se voce precisa de uma copia para editar sem tocar no original, o round-trip JSON funciona para dados simples. Com Date, funcoes ou ciclos, os problemas aparecem rapido.
Copia superficial vs profunda
Spread e Object.assign copiam so o primeiro nivel; objetos aninhados continuam compartilhados.
O caminho JSON preserva apenas valores serializaveis em JSON.
O que se perde
undefined, funcoes e chaves Symbol somem; Date vira string ISO e deixa de ser instancia Date.
Map, Set e RegExp se degradam; NaN e Infinity nao sao mantidos de forma confiavel.
const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }Referencias circulares falham
Se o objeto aponta para si mesmo, stringify dispara Converting circular structure to JSON.
Para grafos, use structuredClone ou uma caminhada com WeakMap.
Quando structuredClone vence
Em navegadores modernos e Node 17+, preserva Date, Map, Set, RegExp e ciclos.
Ainda nao clona funcoes, nos DOM nem metodos de prototipo.
Como escolher
Para payload JSON puro de API, o round-trip JSON ainda e leve e pratico.
Com datas, maps ou ciclos, prefira structuredClone; para grafos complexos, cloneDeep.