var a = [{}];
var b = [];
var c = a.concat(b);

console.log(a[0] === c[0]);
c[0] = undefined;
console.log("a[0] value: ", a[0]);
console.log("c[0] value: ", c[0]);

Depuis https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat :

Références d'objet (et non l'objet réel) : concat copie les références d'objet dans le nouveau tableau. Le tableau d'origine et le nouveau tableau font tous deux référence au même objet. C'est-à-dire que si un objet référencé est modifié, les modifications sont visibles à la fois dans les nouveaux tableaux et dans les tableaux d'origine. Cela inclut des éléments d'arguments de tableau qui sont également des tableaux.

Je m'attends à ce que la valeur de a[0] devienne indéfinie lorsque je modifie c[0] car a[0] et c[0] contiennent des références au même objet, mais ce n'est clairement pas le cas. Que se passe-t-il ici. Qu'est-ce que je rate?

1
LearningMath 14 mars 2019 à 17:04

2 réponses

Meilleure réponse

Références d'objet (et non l'objet réel) : concat copie les références d'objet dans le nouveau tableau.

Il est vrai que l'objet référence est copié, mais la référence copiée est toujours indépendante de la première référence. L'affectation à l'élément de tableau ne modifie que cette référence. En effet, après concat() vous avez a[0] et c[0] pointant sur le même objet.

a[0].abc = "abc"
console.log(c[0].abc); // will print "abc".

Mais affecter à c[0] ne fait qu'écraser la référence avec undefined, laissant la référence dans a[0] (et l'objet) intacte.

3
Christoph Burschka 14 mars 2019 à 14:15

Documentation Mozilla JS "La méthode concat() est utilisée pour fusionner deux ou plusieurs tableaux. Cette méthode ne modifie pas les tableaux existants, mais renvoie à la place un nouveau tableau." La méthode concat renvoie un tout nouvel objet tableau, indépendant des arguments.

-1
Avinash 15 mars 2019 à 01:08