复制Javascript数组元素时,属性变为链接

时间:2018-08-01 18:02:32

标签: javascript arrays oop properties

我经常给数组元素属性,这样我就不需要使用嵌套数组。但是,当我用array.push(array[0])甚至甚至是array[array.length] = array[0]复制一个数组元素时,它们的新元素和复制的元素将链接在一起-当我更改一个属性时,它将更改另一个属性。 / p>

代码如下:

var array = [{num: 0}, {num: 1}, {num: 2}, {num: 3}];
var i;
var nums = "";
array.push(array[0]);

//What the array looks like before anything is changed
for (i = 0; i < array.length; i += 1) {
    nums += array[i].num + " ";
}
console.log(nums);

array[0].num = 1;

//What the array looks like after changing only one element
nums = "";
for (i = 0; i < array.length; i += 1) {
    nums += array[i].num + " ";
}
console.log(nums);

运行此命令时,尽管仅运行array,但array[0].num = 1的第一个和最后一个元素都被更改。有谁知道发生了什么事以及如何解决?

2 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为数组的元素是对象。您只是将对一个对象的引用分配到多个数组中。如果要将数据从对象复制到全新的对象中,则必须clone them。这样的事情应该可以满足简单对象的需求。

function clone(obj){
    return JSON.parse(JSON.stringify(obj));
}
var array = [{num: 0}, {num: 1}, {num: 2}, {num: 3}];
array.push(clone(array[0]));

答案 1 :(得分:0)

array[0]只是对数组索引0处的对象{num: 0}的引用。 array.push(array[0])将此引用推到数组的后面。您对其中一个引用所做的任何操作都会影响另一个,因为它们指向的是同一件事。

这通过访问基础基元来制作对象的深层副本:

var array = [{num: 0}, {num: 1}, {num: 2}, {num: 3}];

array.push({num: array[0].num});

console.log(array);
array[0].num = 1;
console.log(array);