为什么将对象推入数组会修改数组中不需要的部分?

Hap*_*rs 4 javascript

我试图用一个对象列表填充数组.

  var testarray=[];
  var temp={};

  temp.data = 10;
  temp.data2= 11;
  testarray.push(temp);
  console.log("After first push:");
  console.log(testarray[0].data);
  console.log(testarray[0].data2);

  temp.data = 20;
  temp.data2 = 21;
  testarray.push(temp);
  console.log("After second push:");
  console.log(testarray[0].data);
  console.log(testarray[0].data2);
  console.log(testarray[1].data);
  console.log(testarray[1].data2);
Run Code Online (Sandbox Code Playgroud)

我希望在第二次推送之后,testarray将包含第一个数组元素的值10和11,以及第二个数据元素包含20和21.

实际上,第一个数组元素也包含20和21.因此第二个数据覆盖第一个数组元素.怎么了?

Pra*_*lan 6

temp变量保存对象引用,并且您将对象引用推送两次,因此更新一个属性将更改对象属性.

var testarray = [];
var temp = {};

temp.data = 10;
temp.data2 = 11;
testarray.push(temp);
console.log("After first push:");
console.log(testarray[0].data);
console.log(testarray[0].data2);

// update with new object
temp = {};

temp.data = 20;
temp.data2 = 21;
testarray.push(temp);
console.log("After second push:");
console.log(testarray[0].data);
console.log(testarray[0].data2);
console.log(testarray[1].data);
console.log(testarray[1].data2);
Run Code Online (Sandbox Code Playgroud)