web-dev-qa-db-fra.com

Les objets poussés dans un tableau en copie profonde ou superficielle javascript?

Question assez évidente ... Lorsque vous utilisez .Push () sur un tableau en javascript, l'objet est-il poussé dans le tableau un pointeur (peu profond) ou l'objet réel (profond) quel que soit de type.

67
Travis J

Cela dépend de ce que vous appuyez. Les objets et les tableaux sont poussés comme un pointeur vers l'objet d'origine. Les types primitifs intégrés comme les nombres ou les booléens sont poussés comme copie. Donc, comme les objets ne sont en aucun cas copiés, il n'y a pas de copie profonde ou superficielle pour eux.

Voici un extrait de travail qui le montre:

var array = [];
var x = 4;
let y = {name: "test", type: "data", data: "2-27-2009"};

// primitive value pushes a copy of the value 4
array.Push(x);                // Push value of 4
x = 5;                        // change x to 5
console.log(array[0]);        // array still contains 4 because it's a copy

// object reference pushes a reference
array.Push(y);                // put object y reference into the array
y.name = "foo";               // change y.name property
console.log(array[1].name);   // logs changed value "foo" because it's a reference    

// object reference pushes a reference but object can still be referred to even though original variable is no longer within scope
if (true) {
    let z = {name: "test", type: "data", data: "2-28-2019"};
    array.Push(z);
}

console.log(array[2].name);   // log shows value "test" since the pointer reference via the array is still within scope
120
jfriend00

jfriend00 a raison ici, mais une petite précision: cela ne signifie pas que vous ne pouvez pas changer ce vers quoi votre variable pointe. Autrement dit, y fait initialement référence à une variable que vous placez dans le tableau, mais vous pouvez ensuite prendre la variable nommée y, la déconnecter de l'objet qui se trouve maintenant dans le tableau et connecter y (c'est-à-dire en faire référence) quelque chose de complètement différent sans changer l'objet qui est maintenant référencé uniquement par le tableau.

http://jsfiddle.net/rufwork/5cNQr/6/

var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};

// 1.) pushes a copy
array.Push(x);
x = 5;
document.write(array[0] + "<br>");    // alerts 4 because it's a copy

// 2.) pushes a reference
array.Push(y);
y.name = "foo";

// 3.) Disconnects y and points it at a new object
y = {}; 
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");   
// alerts "foo :: bar" because y was a reference, but then 
// the reference was moved to a new object while the 
// reference in the array stayed the same (referencing the 
// original object)

// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to 
// the object that was initially in y.
36
ruffin