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.