DEV Community

Cover image for Conhecendo o structuredClone
Douglas Biazioli
Douglas Biazioli

Posted on

Conhecendo o structuredClone

Mais um artigo da (quem sabe vire uma) série: "Conhecendo"! 😄 O tema da vez é um método muuuito útil que foi incorporado nos navegadores, o structuredClone.

Mas antes de falar dele, vamos entender um pouco sobre shallow copy e deep copy.


Pra começar, vamos criar um objeto e colocar alguns valores:

const objetoOriginal = {
    a: 'valor1',
    b: 'valor2',
    c: {
        d: 'valor3',
    }
};
Enter fullscreen mode Exit fullscreen mode

Quando executamos esse código, o javascript vai armazenar esses valores em memória e vai criar uma referência a esse endereço de memória para que possamos alterar e acessar quando necessário.

Diagrama básico do armazenamento de objeto

Agora, se fizermos uma cópia simples (shallow copy), estaremos fazendo uma cópia dessa referência, e não do valor que está lá na memória.

Então quando fazemos isso:

const objetoNovo = objetoOriginal;
Enter fullscreen mode Exit fullscreen mode

Por baixo dos panos o que vai acontecer é:
Diagrama báico de um shallow copy

Isso acontece porque o shallow copy é, bem como o nome diz, apenas uma cópia superficial. Dessa forma, se alteramos algum valor no objetoNovo, essa alteração pode acabar refletindo no objetoOriginal e dependendo da situação pode causar muitos problemas.

Já no deep copy a cópia é feita por completo, criando um novo endereço em memória para armazenar o novo objeto.

Diagrama báico de um deep copy

Dessa forma podemos alterar a cópia livremente, sem risco de causar algum efeito colateral indesejado.

Esse tipo de cópia costuma ser um pouco mais custosa, muitas vezes sendo feita manualmente ou utilizando alguma biblioteca externa, como o lodash.


Voltemos agora à nossa estrela de hoje: o structuredClone!

A sintaxe do structuredClone é super simples. Basta passar qual a variável a ser copiada, e será retornado uma cópia completa do que foi passado. Mesmo se for um objeto complexo, com vários níveis, tudo será espelhado.

const objetoClone = structuredClone(objetoOriginal);
Enter fullscreen mode Exit fullscreen mode

Simples assim! 🤩 Não precisamos nem importar nada.

Internamente, o structuredClone implementa um algoritmo de cópia recursiva, que também dá suporte a referências circulares.

Como parâmetro, podemos passar quaaase qualquer tipo de variável. Caso o valor que você tente clonar não seja copiável, será disparado um erro do tipo DataCloneError.

Também temos um segundo parâmetro opcional, que recebe uma lista e nos permite transferir valores. Fazendo com que passem a existir apenas na cópia e não mais no original.

Mas atenção: Não é qualquer valor que pode ser movido. Apenas objetos dos tipos chamados de Transferable podem ser passados nesse parâmetro, entram nessa lista os Buffers, Streams, etc... Mas isso é assunto pra um outro artigo 😉

Em aplicações com bastante manipulação de dados, o structuredClone é extremamente útil! Prático de usar, reduz dependências, além de já ter bastante suporte entre os navegadores, então pode usar sem medo!

Quer ver mais a fundo sobre o structuredClone?

Então dá uma olhada nessa página da MDN, ou veja diretamente a especificação!


E você, já conhecia o structuredClone? Faz cópias de alguma forma diferente? Comenta aqui! 😁

Top comments (0)