# 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
Leave a Reply