Question assez évidente ... Lorsque vous utilisez .push () sur un tableau en javascript, l'objet poussé dans le tableau est-il un pointeur (peu profond) ou l'objet réel (profond) quel que soit le type.
Réponses
Trop de publicités?Cela dépend de ce que vous insistez. Les objets et les tableaux sont poussés par référence. Les types intégrés, tels que les nombres, sont copiés.
var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};
// pushes a copy
array.push(x);
x = 5;
alert(array[0]); // alerts 4 because it's a copy
// pushes a reference
array.push(y);
y.name = "foo";
alert(array[1].name); // alerts "foo" because it's a reference
Démo de travail de ce code: http://jsfiddle.net/jfriend00/5cNQr/
jfriend00 est à droite sur la marque ici, mais une petite précision: cela ne signifie pas Que vous ne pouvez pas changer ce que votre variable de pointe. C'est, y
initialement référence à la variable que vous mettez dans le tableau, mais vous pouvez ensuite prendre la variable nommée y
, débranchez-le de l'objet dans le tableau maintenant, et connecter y
(c'est à dire, faire référence) quelque chose de différent entièrement 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.