我正在尝试使用对象列表填充数组。
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.所以第二个数据元素会覆盖第一个数组元素。有什么问题?
答案 0 :(得分: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);

答案 1 :(得分:2)
见这里:
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);
//console.log(temp)
temp = {} // You have to clear values of variable temp before adding new value on to it
//console.log(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);
答案 2 :(得分:1)
说明:
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
所以当您使用此链接调用此对象时,您将调用同一个对象宾语。在你的情况下,你需要创建两个不同的对象,你可以使用这种方式
function myClass (data, data2) {
return {
data: data,
data2: data2
}
}
var testarray=[];
var temp = new myClass(10, 11);
testarray.push(temp);
console.log("After first push:");
console.log(testarray[0].data);
console.log(testarray[0].data2);
var temp = new myClass(20, 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);
答案 3 :(得分:0)
在更改属性并执行推送
之前执行此操作temp = {}
这将设置对temp