7
votes

Pourquoi ne puis-je pas concéder une référence de tableau en JavaScript?

J'ai deux matrices, l'une est une référence (paramètre) à partir d'une fonction, et l'autre est créée dans le cadre de la fonction - exactement le même scénario que celui décrit ici:

Ajouter deux tableaux sans utiliser la méthode Concat < / p>

J'utilisais la méthode push.apply () selon la suggestion ci-dessus, mais quelqu'un peut-il m'expliquer, pourquoi je ne peux pas utiliser Concat () pour fusionner deux matrices si le tableau est envoyé dans la fonction en tant que Référence?


1 commentaires

Regardez le lien. Peu importe ce que je fais, c'est exactement la même chose que montré sur l'autre page.


3 Réponses :


9
votes

Si vous utilisez concat code> le tableau d'origine sera non modifié em>. Si vous avez une référence à cela, vous ne verrez pas les nouveaux éléments.

var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
var arr3 = arr1.concat(arr2);


2 commentaires

Je ne pourrai pas accepter 2 réponses mais c'était utile aussi bien-être, merci!


Cela nécessite-t-il une array.ProTotype ou peut-il être fait avec juste un tableau?



10
votes

Voir array.concat sur MDN:

Toute opération sur le nouveau tableau n'aura aucun effet sur les matrices d'origine , et inversement.

Ceci fait se comporter différemment de array.push.apply quel sera muté l'objet de tableau d'origine - la valeur de retour de Array.concat doit être utilisé. Sinon, cela fonctionne comme expliqué dans le lien MDN ci-dessus.


2 commentaires

Il indique également que "des références d'objet (et non de l'objet réel): Concocies copie des références d'objet dans la nouvelle matrice. L'original et la nouvelle matrice se rapportent au même objet. C'est-à-dire que si un objet référencé est modifié, les modifications sont visibles. aux nouveaux et originaux. "


@Tamas qui parle d'objets dans les tableaux, pas les tableaux eux-mêmes - mais oui.



1
votes

Disons que nous avons 2 tableaux "A" et "B". array.concat code> méthode retournera forte> nouvelle instance de de code> "C" qui représente la concaténation entre A et B sans aucune mutation d'une ou b fort>. Array.Push Code> Retour Strong> Dernier index d'élément poussé et muté Ceci code> strong> de
de
Depuis ES6 (ou 15, pas sûr), il est possible de décompresser les paramètres et vous pouvez utiliser Push to Concaténate (sans code nocif) également

a = [1,2,3,4]; // a=[1,2,3,4];
b = [5,6,7,8]; // b=[5,6,7,8]; 
a.push(...b)   // a=[1,2,3,4,5,6,7,8]; b=[5,6,7,8] 


1 commentaires

Merci, c'est très utile!