Javascript通过引用而不是值传递?

Javascript passing by reference instead of value?

本问题已经有最佳答案,请猛点这里访问。

你好,谢谢你的帮助

当我写一些代码的时候,我遇到了一个问题。在下面的示例中。我希望alert(a.x)输出1,而不是输出2。我开始了解到这是因为a作为参考被传递给this.b。我找不到的是如何用价值来传递它。(如中所述,我不想每次调用x()时都修改a)

1
2
3
4
5
6
7
8
9
10
var a = {"x":1}

function x() {
  this.b = v;
  this.b.x++;
}

x();

alert(a.x); //prints 2

我也尝试了以下和其他的变种,但没有用…

1
2
3
4
5
6
7
8
9
10
var a = {"x":1}

function x(v) {
  this.b = v;
  this.b.x++;
}

x(a);

alert(a.x); //... still prints 2

有人能告诉我我遗漏了什么吗?

谢谢你,谢谢你

(旁注:这是一篇接近我所说内容的文章,但我不知道如何使它适用于我的情况……如果情况完全相同)


所以也许我可以通过分解正在发生的事情为你提供一些清晰的信息。

1
2
3
4
5
6
7
8
9
10
var a = {"x":1} // a refers to object with key"x"

function x(v) {  // v is now a reference to the object with key"x"
  this.b = v;   // this.b now is a reference to the object with key"x"
  this.b.x++;   //this.b.x++ points to the object with key"x" so it can increment it's value.
}

x(a);  // passes in a the value of reference to object with key"x"

alert(a.x); //... still prints 2

您可以执行此链接中可以找到的操作:

1
2
3
4
5
6
7
8
var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

当你打电话:

1
x(a);

一些事情正在发生。首先,变量a(仅保存对对象的引用)按值传递给函数xx现在有了它自己的引用副本,正好指向内存中的同一个对象。因此,对所引用对象的属性所做的任何更改都将影响对所述对象的其他引用。

当你打电话:

1
this.b = v;

你又复制了一份v,并将其设置为this.b。现在,avthis.b是内存中不同的变量,它们都存储对同一对象的引用。

您试图做的似乎是创建对象本身的副本,这样您就可以操作一个引用,而不会影响其他引用。为此,您需要在内存中创建一个全新的对象,并在属性上进行复制。

1
2
3
4
5
6
7
8
9
10
11
12
var a = {"x":1}

function x(v) {
    this.b = {}; // Create a new object
    this.b.x = v.x; // Copy over the x property
    // Copy over any other properties too
    this.b.x++;
}

x(a);

alert(a.x); // The original object still has an x property of 1

由于this.b是一个新对象,我们只是复制了v所指对象的属性,因此递增this.b.xv所指的对象没有影响。