JS Source:
var c1 = ["Saab", "Volvo", "BMW"]; var c2=c1; c1.sort(); document.getElementById("demo").innerHTML = '1 -> '+c1+'<br>2 -> '+c2;
RÉSULTAT: 1 -> BMW, Saab, Volvo 2 -> BMW, Saab, Volvo
Je dois être: 1 -> BMW, Saab, Volvo 2 -> Saab, Volvo, BMW
Quand tu dis
var c2=c1;
Vous faites réellement c2
point sur le même objet référencé par c1
. Ensuite, vous modifiez l'objet Array c1
. Puisque c2
et c1
renvoient le même objet, c1
et c2
imprimeront le même objet.
Vous devez faire une copie de l'objet Array. Vous pouvez utiliser c1.slice()
pour faire cela, comme ça
var c2 = c1.slice();
Maintenant c2
réfère à une copie du tableau c1
. Ainsi, les modifications apportées au c1
n'affecteront pas l'objet c2
.
La ligne:
var c2=c1;
… ne crée pas une copie du tableau, il crée une deuxième référence au même objet de tableau sous-jacent. Ainsi, les modifications que vous effectuez via l'une ou l'autre variable affecteront le même tableau, que ce soit le tri, l'ajout d'éléments ou autre.
Heureusement, il est facile de créer une copie d'un tableau:
var c2 = c1.slice();
La méthode .slice()
renvoie une copie d'une partie d'un tableau ou, si vous l'appelez sans arguments (ou avec juste un index de début de 0
), il copie l'ensemble du tableau. Alors, les variables c1
et c2
se référeront à deux tableaux différents et vous pouvez trier ou modifier un autre sans changer l'autre.
Utilisez simplement une tranche (0):
var c1 = ["Saab", "Volvo", "BMW"]; var c2=c1.slice(0); c1.sort(); alert(c1); alert(c2);
Voici un exemple:
Cordialement, Felipe