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

时间:2017-08-04 16:02:46

标签: 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);

我希望在第二次推送之后,testarray会包含值 对于第一阵列元件10和11,和 20和21为第二个。

实际上,第一个数组元素也包含20和21.所以第二个数据元素会覆盖第一个数组元素。有什么问题?

4 个答案:

答案 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'}和三个指向此对象的链接:objbc所以当您使用此链接调用此对象时,您将调用同一个对象宾语。在你的情况下,你需要创建两个不同的对象,你可以使用这种方式

  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

的新引用