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

Javascript 为什么将对象推入数组会修改数组中不需要的部分?,javascript,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

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

  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);
我希望在第二次推送之后,testarray将包含值 10和11表示第一个数组元素,以及 第二个是20和21


但实际上,第一个数组元素也包含20和21。因此,第二次推送将覆盖第一个数组元素。有什么问题?

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

var testarray=[];
var temp={};
温度数据=10;
温度数据2=11;
试验推送(温度);
日志(“第一次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
//使用新对象更新
温度={};
温度数据=20;
温度数据2=21;
试验推送(温度);
日志(“第二次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
console.log(testarray[1].data);
console.log(testarray[1].data2)请参见此处:

var testarray=[];
var temp={};
温度数据=10;
温度数据2=11;
试验推送(温度);
日志(“第一次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
//控制台日志(临时)
temp={}//在向其添加新值之前,必须清除变量temp的值
//控制台日志(临时)
温度数据=20;
温度数据2=21;
试验推送(温度);
日志(“第二次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
console.log(testarray[1].data);
console.log(testarray[1].data2)说明:

var obj = {prop: 'value'};
var b = obj;
var c = obj;

b.prop = 'new value'

console.log (c.prop) // 'new value'
为什么会这样?因为您有一个对象
{prop:'value'}
和指向此对象的三个链接:
obj
b
c
,所以当您使用此链接调用此对象时,您将调用同一个对象。在您的情况下,您需要创建两个不同的对象,并且可以使用这种方式来创建它们

函数myClass(数据,数据2){
返回{
数据:数据,
数据2:数据2
}
}
var testarray=[];
var temp=新的myClass(10,11);
试验推送(温度);
日志(“第一次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
var temp=新的myClass(20,21);
试验推送(温度);
日志(“第二次推后:”);
console.log(testarray[0].data);
console.log(testarray[0].data2);
console.log(testarray[1].data);

console.log(testarray[1].data2)在更改属性和执行推送之前执行此操作

temp = {} 
这将设置对
temp