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',
}
};
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.
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;
Por baixo dos panos o que vai acontecer é:
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.
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);
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)