Есть ли объекты, помещенные в массив в javascript глубокой или мелкой копии?


довольно самоочевидный вопрос...При использовании. push () на массиве в javascript-это объект, помещенный в массив указателем (мелкий) или фактическим объектом (глубокий)независимо от типа.

2 64

2 ответа:

Это зависит от того, что ты толкаешь. Объекты и массивы передаются как указатель на исходный объект . Встроенные примитивные типы, такие как числа или логические значения передаются как копии. Итак, поскольку объекты никак не копируются, для них нет глубокой или мелкой копии.

вот рабочий фрагмент, который показывает, что:

var array = [];
var x = 4;
var 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

jfriend00 находится прямо на отметке здесь, но одно небольшое уточнение: это не означает, что вы не можете изменить то, на что указывает ваша переменная. То есть, y первоначально ссылается на некоторую переменную, которую вы помещаете в массив, но затем вы можете взять переменную с именем y, отключите его от объекта, который сейчас находится в массиве, и подключите y (т. е. сделать ссылка) что-то совершенно другое без изменения объекта, который сейчас находится ссылка только на массив.

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.