JavaScript:将对象存储为固定值?

JavaScript:将对象存储为固定值?,javascript,variables,object,Javascript,Variables,Object,我在编写JavaScript时注意到了这种行为,但我一直无法找出原因: 下面是一些代码,用于重现所讨论的行为 var o1 = { num: 1 } var o2 = o1; o2.num = 2; alert(o1.num); var o1={ 数目:1 } var o2=o1; o2.num=2; 警报(o1.num); 预期结果:浏览器警告1,因为我只更改了o2对象的属性,而没有更改o1对象的属性 实际结果:浏览器警告2,因为o1似乎等于o2 我真的不确定发生了什么事。如何修复代码,使

我在编写JavaScript时注意到了这种行为,但我一直无法找出原因:

下面是一些代码,用于重现所讨论的行为

var o1 = { num: 1 } var o2 = o1; o2.num = 2; alert(o1.num); var o1={ 数目:1 } var o2=o1; o2.num=2; 警报(o1.num); 预期结果:浏览器警告1,因为我只更改了o2对象的属性,而没有更改o1对象的属性

实际结果:浏览器警告2,因为o1似乎等于o2

我真的不确定发生了什么事。如何修复代码,使其向1而不是2发出警报(假设o1没有更改)


非常感谢。

通过编写
VarO2=o1
您正在对同一对象进行
o1
o2
两次引用。您要做的是克隆
o1
对象,并将克隆的副本存储在
o2
中。在JavaScript中搜索克隆对象。

因为两个变量引用了同一个对象。变量赋值时不克隆/复制对象


JavaScript的行为方式与本例中的任何(大多数)其他OO语言相同。

因为您将对象设置为相同的参考点。您需要克隆对象。下面是中的一段代码,它允许使用原型技术克隆对象

Object.prototype.clone = function() {
  return eval(uneval(this));
}
alert("test".clone());
alert((3).clone());
alert(clone.clone());
“o2”变成了“o1”的引用。记住,uneval()仅在Firefox上可用。据我所知,它在IE、Chrome和Safari上不起作用。