为什么更改已经推送到数组的对象也会更改数组中的值?

时间:2013-05-05 20:40:27

标签: javascript arrays

检查此代码:

var bbb = [];
var aaa = {};

aaa.test = "1";
bbb.push(aaa);
console.log(bbb[0].test);

aaa.test = "2";
bbb.push(aaa);
console.log(bbb[0].test);

为什么控制台输出为“1,2”?我认为它应该是“1,1”。

2 个答案:

答案 0 :(得分:2)

通过引用将对象添加到数组中。因此,当您执行bbb[0]时,它指的是您之前创建的aaa实例,然后进行了修改。

如果您不想要此行为,则需要在添加对象之前克隆该对象。

bbb.push(clone(aaa))

至于clone()的实现,如果你有jQuery:

function clone(obj) {
  return jQuery.extend({}, obj);
}

没有jQuery:

function clone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

<强> Demo

答案 1 :(得分:0)

您将aaa的引用传递给数组。因此,当您对aaa进行更改时,它会反映在数组的第一个元素中。