Question

Voici un code qui a deux tableaux (np et op), l'un une copie de l'autre

Cependant, lorsque je modifie la copie, l'original est également modifié! jetez un oeil:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

Est-il possible de conserver l'original et de modifier la copie?

Était-ce utile?

La solution

Vous n'avez jamais copié le tableau. Vous avez simplement assigné le tableau à une autre variable. Cela ne copie pas en Javascript. Dans votre exemple, vous ne pouvez accéder qu’à un tableau contenant deux variables. Il n’existe pas de méthode intégrée pour copier des tableaux en Javascript, vous devez donc écrire votre propre fonction pour le faire.

Consultez la question de StackOverflow pour en savoir plus sur la mise en œuvre. la copie des éléments du tableau.

Autres conseils

Certaines des fonctions intégrées de la matrice créeront une copie pour vous. Un tel est slice.

Par exemple:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

Référence http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165

Vous ne créez pas une copie du tableau, vous créez simplement une copie de la référence au tableau. Vous obtenez donc deux références au même objet tableau.

Voici comment créer une copie réelle du tableau:

var np = op.concat();

La méthode concat crée un nouveau tableau qui est une copie du tableau avec tous les éléments supplémentaires ajoutés. Si vous ne spécifiez pas d’éléments supplémentaires, vous n’obtenez qu’une copie du tableau.

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

Ensuite


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

Vous devriez cloner le second tableau au lieu de le copier.

--- Mise à jour

Si vous affectez un objet à une variable, seule la référence est copiée (cela signifie que les deux pointent vers les mêmes données). Pour avoir une copie indépendante de cet objet, vous devez le cloner. Et il y a plusieurs façons de procéder, par exemple here décrit le moyen de cloner un objet à l'aide de jQuery.

Vous pouvez simplement utiliser la méthode native slice qui renvoie une copie du tableau:

var np = op.slice(0,op.length);

Le deuxième paramètre devrait être facultatif, mais dans IE, je pense qu'il est requis.

Votre code, avec la modification:

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

Pour créer un nouveau tableau, vous pouvez envisager de:

   var op = [];

Pour copier un tableau:

var np=op.slice();

ou

var np=op.concat();

concat est plus rapide, alors que slice prend un caractère de moins. Certaines personnes alias " slice " ou "concat" en tant que " copie " il est donc plus évident que vous en fassiez une copie.

Pas besoin de paramètres dans les deux cas. Les paramètres de la tranche rendront le code plus gros et plus lent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top