On imagine le tableau suivant:
const elements = ["Azote", "Bore", "Cuivre", "Dubnium", "Europium", "Fer"]
J'aimerais copier ce tableau.
const duplicate = elements
Tout va bien. Je souhaite remplacer dans "duplicate" le "Dubnium" par "Dora l'Exploratrice".
duplicate[3] = "Dora l'Exploratrice"
J'affiche les tableaux.
console.log(elements)
console.log(duplicate)
En fait, avec
const duplicate = elements,
j'ai créé un alias de elements nommé duplicate. Si je modifie l'un d'eux, l'autre sera également modifié.
C'est comme si je disais x = 4 ; puis y = x. En changeant y, je change x et vice-versa.
Mais comment copier un tableau sans que ça ne modifie tout ?
Un elements.slice() est suffisant.
[].concat(elements) copie le contenu de elements dans un nouveau tableau vierge.
Ce sont les 3 points magiques qui permettent de dupliquer un tableau.
[...elements]
Transforme l'argument en tableau. C'est utile quand nous travaillons sur un Set, pour enlever les doublons.
On peut faire à peu près la même chose pour les objets.
On imagine l'objet suivant:
const hero = {name: "Argh", hp: 1870}
Tout comme pour les tableaux, je ne peux pas référencer "hero" pour créer un autre objet et modifier une clé de celui-ci sans que ça ne se répercute sur l'objet initial !
Assign exige 3 paramètres: un objet (vide ou pas), l'objet cible, et un objet avec les propriétés à rajouter.
const duplicate = Object.assign({}, hero, {atk: 119})
Ne marche que pour les tableaux, pas pour les objets !
const duplicate = {...hero} provoquera une erreur...
JSON.parse(JSON.stringify(hero))