Javascript 在没有副作用的情况下更改和指定对象

Javascript 在没有副作用的情况下更改和指定对象,javascript,Javascript,我目前拥有以下代码: var myArray = []; var myElement = { id: 0, value: 0 } myElement.id = 0; myElement.value = 1; myArray[0] = myElement; myElement.id = 2; myElement.value = 3; myArray[1] = myElement; 问题是,当我为第二个元素更改id和value的值时,第一个元素中的值也会更改。有没有一种方法可以在不更改

我目前拥有以下代码:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id = 0;
myElement.value = 1;
myArray[0] = myElement;

myElement.id = 2;
myElement.value = 3;
myArray[1] = myElement;

问题是,当我为第二个元素更改
id
value
的值时,第一个元素中的值也会更改。有没有一种方法可以在不更改数组中先前插入的值的情况下不断添加新元素?

您需要不断创建新对象,或者克隆现有对象。请参阅以了解如何克隆。

请尝试以下操作:

var myArray = [];

myArray.push({ id: 0, value: 1 });
myArray.push({ id: 2, value: 3 });

或者这对您的情况不起作用吗?

如果您使用jQuery,您可以使用


这是因为对象值是通过引用传递的。您可以像这样克隆对象:

var myArray = [];
var myElement = {
  id: 0,
  value: 0
}

myElement.id =0;
myElement.value=1;
myArray[0] = myElement;

var obj = {};
obj = clone(myElement);
obj.id = 2;
obj.value = 3; 

myArray[1] = obj;

function clone(obj){
  if(obj == null || typeof(obj) != 'object')
    return obj;

  var temp = new obj.constructor(); 
  for(var key in obj)
    temp[key] = clone(obj[key]);

  return temp;
}    

console.log(myArray[0]);
console.log(myArray[1]);
结果:

 - id: 0
 - value: 1
 - id: 2
 - value: 3

对象是通过引用传递的。。要创建一个新对象,我采用以下方法

//Template code for object creation.
function myElement(id, value) {
    this.id = id;
    this.value = value;
}
var myArray = [];

//instantiate myEle
var myEle = new myElement(0, 0);
//store myEle
myArray[0] = myEle;

//Now create a new object & store it
myEle = new myElement(0, 1);
myArray[1] = myEle;

这是一个教科书案例:


在数组中会有两次相同的对象,因为对象值是通过引用传递的。你必须创建一个像这样的新对象

myElement.id = 244;
myElement.value = 3556;
myArray[0] = $.extend({}, myElement); //for shallow copy or
myArray[0] = $.extend(true, {}, myElement); // for deep copy


push({id:24,value:246})

我已经实现了另一个答案,但我同意这也是一个很好的解决方案。谢谢
var myArray = [];

function myElement(id, value){
    this.id = id
    this.value = value
}

myArray[0] = new myElement(0,1)
myArray[1] = new myElement(2,3)
// or myArray.push(new myElement(1, 1))
myElement.id = 244;
myElement.value = 3556;
myArray[0] = $.extend({}, myElement); //for shallow copy or
myArray[0] = $.extend(true, {}, myElement); // for deep copy