Есть объекты, помещенные в массив в глубоком или неглубоком javascript? - PullRequest
67 голосов
/ 29 декабря 2011

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

Ответы [ 2 ]

120 голосов
/ 29 декабря 2011

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

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

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
36 голосов
/ 08 февраля 2013

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.
...