Javascript passing by reference instead of value?
本问题已经有最佳答案,请猛点这里访问。
你好,谢谢你的帮助
当我写一些代码的时候,我遇到了一个问题。在下面的示例中。我希望
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); |
一些事情正在发生。首先,变量
当你打电话:
1 | this.b = v; |
你又复制了一份
您试图做的似乎是创建对象本身的副本,这样您就可以操作一个引用,而不会影响其他引用。为此,您需要在内存中创建一个全新的对象,并在属性上进行复制。
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 |
由于