如何禁用JS中的指针用法?

时间:2012-04-25 15:40:43

标签: javascript json pointers reference

为什么结果为{"a":"b","c":1}

var foo = {"a":"b","c":0};
var bar = foo;
bar.c++;
alert(JSON.stringify(foo));

如何禁用此行为?

4 个答案:

答案 0 :(得分:4)

foobar变量都引用同一个对象。使用哪个引用来修改该对象并不重要。

你不能禁用这种行为,这就是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的工作方式。

如果更改参考对象,它会影响所有对象引用...