Clonando um array em JavaScript

Entenda como clonar um array em JavaScript com os métodos slice(), spread operator e outras técnicas para evitar referências indesejadas.

Como clonar um array em JavaScript?

Clonar um array em JavaScript é uma tarefa importante quando você precisa trabalhar com uma cópia de um array, mas sem afetar o array original. Ao contrário de objetos, arrays em JavaScript são manipulados por referência, o que significa que se você atribuir um array a uma nova variável, ambas as variáveis apontarão para o mesmo array. Existem várias maneiras de clonar arrays, como usando slice(), o spread operator (...) e Object.assign(). Vamos ver como usar cada uma dessas técnicas.

Método slice()

O método slice() é uma maneira fácil e rápida de clonar um array. Ele retorna uma nova cópia do array original, sem modificar o array original. O slice() pode ser usado sem parâmetros para copiar todo o array.

Exemplo de código com slice():

let numeros = [1, 2, 3, 4, 5];
let numerosClonados = numeros.slice();
console.log(numerosClonados);  // Exibe [1, 2, 3, 4, 5]

Neste exemplo, o método slice() cria uma cópia do array numeros, que é armazenada em numerosClonados. O array original não é alterado.

Características do slice()

  • Cria uma nova cópia do array sem modificar o original.
  • Simples de usar: Basta chamar slice() sem argumentos para copiar o array todo.
  • Não funciona para arrays multidimensionais: Se o array contiver objetos ou arrays aninhados, a cópia será superficial (referência aos objetos internos será mantida).

Método Spread Operator (...)

O spread operator (...) é uma forma concisa e moderna de clonar arrays. Ele espalha os elementos de um array em uma nova cópia, criando um novo array com os mesmos elementos.

Exemplo de código com o spread operator:

let numeros = [1, 2, 3, 4, 5];
let numerosClonados = [...numeros];
console.log(numerosClonados);  // Exibe [1, 2, 3, 4, 5]

O spread operator é uma maneira muito comum de criar uma cópia de um array, e ele oferece uma sintaxe mais legível e compacta do que o slice(). Funciona bem para arrays simples, mas também pode ser usado em arrays com elementos adicionais como objetos ou outros arrays.

Características do Spread Operator

  • Sintaxe simples e compacta: O spread operator é muito usado por ser direto e fácil de entender.
  • Cria uma cópia rasa: Semelhante ao slice(), o spread operator cria uma cópia rasa, o que significa que se o array contiver objetos ou arrays internos, esses elementos ainda serão copiados por referência.
  • Pode ser usado em objetos: Além de arrays, o spread operator também pode ser utilizado para clonar objetos.

Método Object.assign()

Embora o Object.assign() seja mais comumente usado para clonar objetos, também pode ser utilizado para arrays. Ele cria uma cópia rasa do array, semelhante ao slice() e ao spread operator. Contudo, Object.assign() é frequentemente utilizado para manipulação de objetos.

Exemplo de código com Object.assign():

let numeros = [1, 2, 3, 4, 5];
let numerosClonados = Object.assign([], numeros);
console.log(numerosClonados);  // Exibe [1, 2, 3, 4, 5]

Aqui, Object.assign() cria uma cópia do array numeros, passando uma lista vazia [] como o primeiro parâmetro, e o array original como o segundo. Assim, ele cria um novo array com os mesmos valores.

Características do Object.assign()

  • Criação de cópia rasa: Como slice() e o spread operator, Object.assign() cria uma cópia rasa do array.
  • Versátil: Pode ser usado também para copiar objetos, o que o torna útil em contextos em que tanto arrays quanto objetos precisam ser manipulados.
  • Menos intuitivo: Embora útil, o uso de Object.assign() para arrays pode ser um pouco mais confuso do que o uso do slice() ou do spread operator.

Comparando os métodos

Método O que faz Tipo de cópia
slice() Cria uma cópia do array Cópia rasa (referências mantidas para objetos internos)
spread operator Cria uma cópia do array Cópia rasa (referências mantidas para objetos internos)
Object.assign() Cria uma cópia do array Cópia rasa (referências mantidas para objetos internos)

Quando usar cada método?

  • Use slice() quando você deseja uma solução simples para copiar arrays, sem a necessidade de sintaxes adicionais.
  • Use o spread operator quando quiser uma sintaxe mais moderna e compacta para clonar arrays e, se necessário, combinar com objetos.
  • Use Object.assign() quando estiver lidando com objetos ou quando já estiver utilizando Object.assign() para manipulação de objetos e quiser clonar arrays de maneira consistente.

Conclusão

Clonar arrays em JavaScript é uma tarefa fundamental para evitar problemas de referência e garantir que os dados sejam manipulados corretamente. O método slice() é simples e eficaz para arrays pequenos, o spread operator é uma opção moderna e compacta, e Object.assign() oferece uma abordagem versátil para trabalhar com tanto arrays quanto objetos. A escolha do método depende da sua necessidade de flexibilidade e da estrutura dos dados que está manipulando.

Clonar arrays corretamente é crucial quando se trabalha com dados dinâmicos e quando se precisa de uma cópia independente de um array. Métodos como slice(), o spread operator e Object.assign() são soluções rápidas e eficientes, cada uma com suas vantagens dependendo do seu contexto. O slice() e o spread operator são ideais para operações simples de clonagem, enquanto Object.assign() pode ser útil para cenários mais complexos, como quando se trabalha com objetos e arrays simultaneamente.

Algumas aplicações:

  • Criar cópias de arrays para evitar modificações inesperadas no array original.
  • Trabalhar com dados dinâmicos, onde você precisa manipular uma cópia dos dados sem afetar a original.
  • Clonar arrays para processar informações em funções, sem alterar o array de entrada.
  • Usar clones de arrays em algoritmos de busca ou filtros onde as modificações não devem afetar os dados de entrada.

Dicas para quem está começando

  • Experimente usar o spread operator, pois é uma forma simples e moderna de clonar arrays.
  • Use slice() quando precisar de uma solução simples e não quiser lidar com sintaxe mais complexa.
  • Entenda que todos os métodos criam cópias rasas, ou seja, se o array contiver objetos ou arrays internos, esses elementos serão copiados por referência.
  • Se precisar de cópias profundas (ou seja, clonagem total de objetos internos), considere usar outras técnicas como JSON.parse()/JSON.stringify() ou implementar funções de clonagem recursiva.

Contribuições de Lucas Souza

Compartilhe este tutorial: Como clonar um array em JavaScript?

Compartilhe este tutorial

Continue aprendendo:

O que é splice() e como ele funciona?

Entenda como usar o método `splice()` em JavaScript para manipular arrays de maneira eficiente, incluindo a remoção, adição e substituição de elementos.

Tutorial anterior

O que são objetos em JavaScript e como criá-los?

Entenda o conceito de objetos em JavaScript, como criar e manipular objetos para organizar dados de maneira eficiente.

Próximo tutorial