对象是以 javascript 深拷贝还是浅拷贝方式推送到数组中?

很明显的问题... 当使用。在 javascript 中,数组的 push ()是指被推入数组的对象是指针(浅)还是实际的对象(深) 无论如何类型。

55225 次浏览

这取决于你推动的是什么。对象和数组作为指向原始对象的指针被推送。像数字或布尔值这样的内置基元类型被作为副本推送。因此,由于对象不是以任何方式复制的,所以不存在深拷贝或浅拷贝。

下面是一个工作代码片段:

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

Jfriend 00在这一点上是正确的,但是有一点需要澄清: 这并不意味着您不能更改变量所指向的内容。也就是说,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.