JSON.parse(JSON.stringify()) VS structuredClone()
A forma certa (e a forma gambiarra) de clonar objetos em JavaScript
Se você já precisou clonar um objeto em JavaScript, provavelmente fez isso:
const clone = JSON.parse(JSON.stringify(obj));E sentiu aquele orgulho momentâneo de hacker raiz. Mas… você também provavelmente já quebrou algo sem entender o porquê. Estou errado?
Hoje vamos comparar:
JSON.parse(JSON.stringify())structuredClone()
E entender quando usar, quando evitar e por que você talvez esteja perdendo dados sem perceber.
O Problema: Clonagem Profunda (Deep Clone)
Em JavaScript, copiar objetos não é tão simples quanto parece.
const user = { name: "Ana" };
const copy = user;
copy.name = "Carlos";
console.log(user.name); // "Carlos"Isso acontece porque objetos são copiados por referência. Se queremos uma cópia real, precisamos de um deep clone.
A Gambiarra Clássica
const clone = JSON.parse(JSON.stringify(obj));Ela funciona… às vezes 😅
Como isso funciona?
- Converte o objeto para string
- Converte a string de volta para objeto
Simples. Inteligente. Mas cheio de pegadinhas.
🔥 O Problema Real
Veja esse exemplo:
const obj = {
name: "Lucas",
age: 30,
birth: new Date(),
greet() { console.log("Hello") },
undef: undefined
};
const clone = JSON.parse(JSON.stringify(obj));
console.log(clone);Resultado?
{
name: "Lucas",
age: 30,
birth: "2026-02-19T00:00:00.000Z"
}💀 O que sumiu?
- ❌ Funções
- ❌ undefined
- ❌ Date virou string
- ❌ Map, Set, BigInt, RegExp… tudo quebrado
structuredClone() — O Jeito Moderno
Agora olha isso:
const clone = structuredClone(obj);Só isso.
Get Gutu Galuppo’s stories in your inbox
Join Medium for free to get updates from this writer.
Sem parse.
Sem stringify.
Sem trauma.
O que ele suporta?
const obj = {
date: new Date(),
map: new Map([["a", 1]]),
set: new Set([1,2,3]),
nested: { value: 42 }
};
const clone = structuredClone(obj);
console.log(clone);Resultado no console:
{
date: 2026-02-19T12:34:56.789Z,
map: Map(1) { 'a' => 1 },
set: Set(3) { 1, 2, 3 },
nested: { value: 42 }
}👉 Observações:
datecontinua sendo um objetoDatemapcontinua sendoMapsetcontinua sendoSetnestedpermanece intacto
Ou seja… nada virou string, nada sumiu, nada foi sacrificado no altar do JSON.stringify() 😌
⚡ O que ele NÃO suporta?
- ❌ Funções
- ❌ DOM Nodes
- ❌ Algumas instâncias customizadas complexas
Mas atenção: isso é intencional. structuredClone é baseado no Structured Clone Algorithm, usado internamente pelo browser (postMessage, IndexedDB etc).
Comparação Direta
Você pode testar isso direto no console do navegador:
const complexObject = {
name: "Test",
date: new Date(),
map: new Map([["key", "value"]]),
set: new Set([1, 2, 3]),
nested: {
arr: [1, 2, 3]
}
};
console.log("JSON clone:");
console.log(JSON.parse(JSON.stringify(complexObject)));
console.log("structuredClone:");
console.log(structuredClone(complexObject));Compare os resultados e observe a diferença.
Performance: Vale a Pena Trocar?
Sim.
Além de mais correto, structuredClone():
- É mais seguro
- É mais expressivo
- Evita bugs silenciosos
- Funciona com tipos modernos
Ele já é suportado em:
- Chrome 98+
- Node 17+
- Firefox moderno
- Edge moderno
Se você ainda precisa suportar ambientes antigos, aí sim talvez precise de fallback.
Quando Ainda Usar JSON.parse(JSON.stringify())?
Sinceramente?
Quase nunca.
Talvez apenas se:
- Você tem 100% certeza que o objeto é simples (POJO puro)
- Não tem Date, Map, Set, BigInt, undefined
- Você está em ambiente muito antigo
Mas hoje em dia, isso é cada vez mais raro.
Conclusão
JSON.parse(JSON.stringify()) foi uma solução criativa.
Mas structuredClone() é a solução correta.
É como comparar:
Fita isolante VS Ferramenta apropriada
Funciona? Funciona.
Mas você quer algo que não quebre no futuro.
Se você gostou desse tipo de conteúdo direto ao ponto e com exemplos reais, salve esse artigo e compartilhe com aquele amigo que ainda clona objeto com JSON hack








