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