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

时间:2013-07-23 04:14:06

标签: javascript pass-by-reference pass-by-value

您好,感谢您的帮助

当我写一些代码时遇到了问题。在下面的例子中。我期待alert(a.x)输出1,而不是输出2.我已经知道这是因为a被传递给this.b作为参考。我似乎无法找到的是如何通过价值来传递它。 (因为我每次拨打a时都不想修改x()

var a = {"x":1}

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

x();

alert(a.x); //prints 2

我也试过以下和其他变种无济于事......

var a = {"x":1}

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

x(a);

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

有人能告诉我我缺少的东西吗?

请和谢谢

(旁注:this is a post接近我所说的,但我无法弄清楚如何使其适用于我的情况......如果情况完全相同)

2 个答案:

答案 0 :(得分:0)

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

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

您可以执行this链接中的内容:

var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

答案 1 :(得分:-1)

致电时:

x(a);

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

致电时:

this.b = v;

您再次复制v并将其设为this.b。现在,avthis.b是内存中的不同变量,都存储对同一对象的引用。

尝试做的事情似乎是创建对象本身的副本,因此您可以操纵一个引用而不影响其他引用。为此,您需要在内存中创建全新对象并复制属性。

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.x将会对v指向的任何内容都没有影响。