Cópia Profunda de Objetos em JavaScript sem Gambiarras Usando structuredClone
Clonar objetos complexos com estruturas aninhadas em JavaScript costumava exigir a perda de tipos de dados ao usar JSON.parse(JSON.stringify()) ou o uso de bibliotecas pesadas. A função nativa structuredClone() resolve esse problema criando uma cópia profunda (deep clone) completa, preservando referências circulares, datas, expressões regulares e estruturas de dados avançadas.
JavaScript
// Objeto complexo com tipos de dados especiais e aninhamento
const usuarioOriginal = {
nome: 'Ana Silva',
criadoEm: new Date('2023-05-15'),
preferencias: { tema: 'escuro', notificacoes: true },
historico: new Set(['login', 'compra', 'logout']),
};
// Realizando a cópia profunda com a API nativa
const usuarioClonado = structuredClone(usuarioOriginal);
// Alterando o objeto clonado para provar a independência de memória
usuarioClonado.preferencias.tema = 'claro';
usuarioClonado.historico.add('atualizacao_perfil');
// Exemplo de uso prático funcionando
console.log('Original (não alterado):', usuarioOriginal.preferencias.tema);
// Saída: 'escuro'
console.log('Clonado (alterado):', usuarioClonado.preferencias.tema);
// Saída: 'claro'
console.log('Data mantida como Date:', usuarioClonado.criadoEm instanceof Date);
// Saída: true
Pontos-chave
- Preservação de Tipos Especiais: Ao contrário de
JSON.stringify(), ostructuredClone()suporta e mantém tipos nativos comoDate,Set,Map,RegExp,ArrayBuffereTypedArray. - Suporte a Referências Circulares: O método lida nativamente com objetos que contêm referências a si mesmos, evitando erros de stack overflow sem exigir algoritmos customizados.
- Limitações de Clonagem: Funções, símbolos (
Symbol), elementos do DOM e objetos com métodos de protótipo não podem ser clonados e lançarão um erroDataCloneError. - Desempenho e Recursos: É executado diretamente pela engine do JavaScript de forma assíncrona/síncrona otimizada, oferecendo ganho de performance em comparação com parsers manuais de JSON ou iterações recursivas em código do usuário.
