Подтвердить что ты не робот

Объекты помещаются в массив в javascript глубокой или мелкой копии?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Мы можем очистить указатель, передав объект/массив через json stringify, а затем проанализируем

newobj.push(JSON.parse(JSON.stringify(obj)));

Я надеюсь, что это кому-то поможет, поэтому я написал.