Articles

# ES6 maneira de clonar um Array 🐑

Quando precisamos copiar um array, muitas vezes usamos slice. Mas com o ES6, você também pode usar o operador de spread para duplicar um array. Pretty nifty, right 🤩

const sheeps = ;// Old wayconst cloneSheeps = sheeps.slice();// ES6 wayconst cloneSheepsES6 = ;

# Why Can’t I Use = to Copy an Array?

porque as matrizes em JS são valores de referência, então quando você tentar copiá-lo usando o = ele só irá copiar a referência para a matriz original e não o valor da matriz. Para criar uma cópia real de um array, você precisa copiar sobre o valor do array sob uma nova variável de valor. Dessa forma, este novo array não faz referência ao antigo endereço array na memória.

const sheeps = ;const fakeSheeps = sheeps;const cloneSheeps = ;console.log(sheeps === fakeSheeps);// true --> it's pointing to the same memory spaceconsole.log(sheeps === cloneSheeps);// false --> it's pointing to a new memory space

# problema com os valores de referência

Se alguma vez lidou com Redux ou com qualquer estrutura de gestão do estado. Você saberá que a imutabilidade é super importante. Permitam-me que explique brevemente. Um objeto imutável é um objeto onde o estado não pode ser modificado depois que ele é criado. O problema com JavaScript é que arrays são mutáveis. Para que isto possa acontecer:

const sheeps = ;const sheeps2 = sheeps;sheeps2.push('🐺');console.log(sheeps2);// // Ahhh 😱 , our original sheeps have changed?!console.log(sheeps);// 

é por isso Que precisamos para clonar uma matriz:

const sheeps = ;const sheeps2 = ;// Let's change our sheeps2 arraysheeps2.push('🐺');console.log(sheeps2);// // ✅ Yay, our original sheeps is not affected!console.log(sheeps);// 

# Mutável vs Imutável Tipos de Dados

Mutável:

  • objeto
  • array
  • função

Imutável:

Todos os primitivos são imutáveis.

  • string
  • número
  • boolean
  • null
  • indefinido
  • o símbolo

# Cópia Superficial Apenas

nota spread só vai um nível de profundidade quando a cópia de uma matriz. Então, se você está tentando copiar uma matriz multidimensional, você terá que usar outras alternativas.

const nums = , ];const cloneNums = ;// Let's change the first item in the first nested item in our cloned array.cloneNums = '👻';console.log(cloneNums);// , , ]// NOOooo, the original is also affectedconsole.log(nums);// , , ]

🤓 Aqui está uma coisa interessante que eu aprendi. Cópia rasa significa que o primeiro nível é copiado, níveis mais profundos são referenciados.

# Input comunitário

# Array.é Outra Forma de Matriz de Clone

const sheeps = ;const cloneSheeps = Array.from(sheeps);

_Thanks: @hakankaraduman _

  • _@hakankaraduman :_ yes, I try not to use spread, it confuses me when reading the code because it does two things, spreading or gathering according to context

  • cj J : I think the best way is the one that most closely matches the semantics of the operation. Eu prefiro usar Array.from