为什么结果为{"a":"b","c":1}
?
var foo = {"a":"b","c":0};
var bar = foo;
bar.c++;
alert(JSON.stringify(foo));
如何禁用此行为?
答案 0 :(得分:4)
foo
和bar
变量都引用同一个对象。使用哪个引用来修改该对象并不重要。
你不能禁用这种行为,这就是JavaScript和许多其他主要语言的工作方式。您所能做的就是明确克隆对象。
var foo = {"a":"b","c":0};
var bar = {"a":foo.a, "c": foo.c};
bar.c++;
答案 1 :(得分:3)
首先,Javascript不传递指针,它传递引用,略有不同。其次,没有办法修改Javascript的默认行为,幸运的是 。
您可能想要做的是创建一个构造函数,并使用它来创建一个对象的两个相似但独立的实例。
function Foo(a, b) {
this.a = a;
this.b = b;
}
var bar1 = new Foo(0, 0);
var bar2 = new Foo(0, 0);
bar2.b++;
console.log(bar1);
console.log(bar2);
>> {a:0, b:0};
>> {a:0, b:1};
答案 2 :(得分:3)
你正在做的是对对象进行第二次引用,但它看起来你想要的是该对象的副本。
如果您需要该功能,那么您真的需要一个复制功能,将所有属性逐个复制到一个新对象中:
// Take all the properties of 'obj' and copy them to a new object,
// then return that object
function copy(obj) {
var a = {};
for (var x in obj) a[x] = obj[x];
return a;
}
var foo = {"a":"b","c":0};
var bar = copy(foo);
bar.c++;
alert(JSON.stringify(foo));
您将获得{"a":"b","c":0}
答案 3 :(得分:2)
您无法停用javascript的工作方式。
如果更改参考对象,它会影响所有对象引用...