109 votes

Pourquoi la modification d'un tableau en JavaScript affecte-t-elle les copies du tableau ?

J'ai écrit le JavaScript suivant :

var myArray = ['a', 'b', 'c'];
var copyOfMyArray = myArray;
copyOfMyArray.splice(0, 1);
alert(myArray); // alerts ['b','c']
alert(copyOfMyArray); // alerts ['b','c']

var myNumber = 5;
var copyOfMyNumber = myNumber;
copyOfMyNumber = copyOfMyNumber - 1;
alert(myNumber); // alerts 5
alert(copyOfMyNumber); // alerts 4        

Ce code déclare une variable myArray et lui attribue la valeur d'un tableau. Il déclare ensuite une deuxième variable copyOfMyArray et lui attribue la valeur myArray . Il effectue une opération sur copyOfMyArray puis alerte les deux myArray y copyOfMyArray . D'une manière ou d'une autre, lorsque j'effectue une opération sur copyOfMyArray il apparaît que la même opération est effectuée sur myArray .

Le code fait ensuite la même chose avec une valeur numérique : Il déclare une variable myNumber et lui attribue une valeur numérique. Il déclare ensuite une deuxième variable copyOfMyNumber et lui attribue la valeur myNumber . Il effectue une opération sur copyOfMyNumber puis alerte les deux myNumber y copyOfMyNumber . Ici, j'obtiens le comportement attendu : différentes valeurs pour myNumber y copyOfMyNumber .

Quelle est la différence entre un tableau et un nombre en JavaScript ? Il semble que la modification d'un tableau change la valeur d'une copie du tableau, alors que la modification d'un nombre ne change pas la valeur d'une copie du nombre.

Je suppose que pour une raison quelconque, le tableau est désigné par une référence et le nombre par une valeur, mais pourquoi ? Comment puis-je savoir à quel comportement m'attendre avec d'autres objets ?

4voto

DonCallisto Points 9157

En JS, l'opérateur "=" copie le pointeur sur la zone mémoire du tableau. Si vous voulez copier un tableau dans un autre, vous devez utiliser la fonction Clone.

Il en va différemment pour les entiers, car il s'agit d'un type primitif.

S.

2voto

Stack Points 19

Créer un filtre du tableau original dans arrayCopy. Ainsi, les modifications apportées au nouveau tableau n'affecteront pas le tableau d'origine.

var myArray = ['a', 'b', 'c'];
var arrayCopy = myArray.filter(function(f){return f;})
arrayCopy.splice(0, 1);
alert(myArray); // alerts ['a','b','c']
alert(arrayCopy); // alerts ['b','c']

J'espère que cela vous aidera.

1voto

Quentin Points 325526

Tout est copié par référence, à l'exception des types de données primitifs (chaînes de caractères et nombres).

1voto

SLaks Points 391154

Vous n'avez pas de copies.
Vous avez plusieurs variables qui contiennent le même tableau.

De même, vous avez plusieurs variables contenant le même nombre.

Lorsque vous écrivez copyOfMyNumber = ... vous introduisez un nouveau nombre dans la variable.
C'est comme écrire copyOfMyArray = ... .

Lorsque vous écrivez copyOfMyArray.splice , vous êtes modifier le tableau original .
Cela n'est pas possible avec les nombres, car les nombres sont immuables et ne peuvent pas être modifiés,

0voto

Erjim Points 11

Vous pouvez ajouter une gestion des erreurs en fonction de votre cas et utiliser quelque chose de similaire à la fonction suivante pour résoudre le problème. N'hésitez pas à nous faire part de vos commentaires pour tout bogue, problème ou idée d'efficacité.

function CopyAnArray (ari1) {
   var mxx4 = [];
   for (var i=0;i<ari1.length;i++) {
      var nads2 = [];
      for (var j=0;j<ari1[0].length;j++) {
         nads2.push(ari1[i][j]);
      }
      mxx4.push(nads2);
   }
   return mxx4;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X