为什么我将原始对象“复制”到新对象后会受到影响?

时间:2012-02-24 10:19:51

标签: javascript

我有一个名为products.original的这个(子)对象。

然后我将其提取到名为productArray的新对象:

var productArray = [];

productArray = products.original;

/*some calculations here*/

//sort the object by lowest score
productArray.sort(function(a, b) {return a.score - b.score;});

最后,我将productArray中的前三个单元格提取到名为resultArray的第三个对象:

var resultArray= [];        
resultArray = productArray.splice(0,3);

令我惊讶的是,这会将products.original的长度减少3(拼接)。为什么?我该怎么做才能阻止这个?提前谢谢。

5 个答案:

答案 0 :(得分:2)

您没有复制数组,只是复制它。因此,所有操作仍在原始对象上执行。 对于真正的克隆,请使用slice

 productArray = products.original.slice(0);

答案 1 :(得分:2)

尝试这种方式:

productArray = products.original.slice();

在javascript对象中通过引用传递。

答案 2 :(得分:2)

splice

  

更改数组的内容,在删除旧元素时添加新元素。

您想要slice

  

返回数组部分的一级深层副本。

答案 3 :(得分:0)

这在JavaScript中是可以预期的。 这个post可以帮助您解决问题。

答案 4 :(得分:0)

productArray = products.original;

实际上并没有将products.original复制到productArray中。而是复制引用。这意味着每次更改productArray时,您也会更改原始对象。为了(深度)复制嵌套对象,你必须做一些复杂的事情,比如迭代对象的成员,检查它们是数组还是对象(将通过引用复制),迭代它们并复制简单数据类型。另一种方法是使用提供复制功能的下划线或jquery。从您的排序功能来看,您的阵列似乎只包含数字。在这种情况下,slice可以解决问题。

请参阅此处查看jquery示例(Deep) copying an array using jQuery