通过引用javascript传递原始变量[重复]

Posted

技术标签:

【中文标题】通过引用javascript传递原始变量[重复]【英文标题】:Passing primitive variables by refence javascript [duplicate] 【发布时间】:2017-01-27 16:59:57 【问题描述】:

我正在尝试通过引用传递原始变量。

var foo = 2;
function inc (arg) 
    arg++

inc(foo) //won't increment foo

上述方法不起作用,因为在 javascript 中,基元(如数字)是按值传递的,而对象是按引用传递的。为了通过引用传递原语,我们需要将它们声明为对象:

var foo = new Number(2)
function inc (arg) 
    arg++

inc(foo) //increments foo

这似乎是一个非常老套的解决方法,并且可能会降低执行速度。在其他 OO 语言中,我们可以将“指针”或“引用”传递给函数。 JS中有这样的东西吗?谢谢!

【问题讨论】:

你在问什么? JavaScript 中没有基元的传递引用。 真正的问题是作用域 你应该阅读 JS 是如何工作的。一个简单的链接:w3schools.com/js/js_scope.asp 更好的链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Closures In other OO languages, we can pass "pointers" or "references" to functions 几乎没有。例如,Java 甚至没有函数(无论如何都不是真正的函数——Java 8 在类上具有语法糖)。问题是,您为什么希望能够通过引用传递?这样做有什么好处? 【参考方案1】:

您不能在 Javascript 中通过引用传递原语 - 示例“解决方法”不起作用。原因如下:

var foo = new Number(2)  // line 1
function inc (arg)      // line 2
    arg++                // line 3

第 1 行将 foo 设置为原始值为 2 的 Number 对象包装器。

第 2 行定义了一个形参 arg,它在函数范围内有自己的存储位置,用于保存参数值的副本。

第 3 行递增实际参数值(Number 对象引用的副本),它存储在分配给 arg 的内存中,而不是 foo。如果您在调用后检查foo 的原始值,它仍然是2。

在实践中,您可以传递对具有递增 foo 属性的对象的引用:

var obj = 
obj.foo = 2
function incFoo (obj) 
    obj.foo++

incFoo()  // obj.foo now 3

ECMA 脚本中基本上没有地址指针可用于引用原始值。

【讨论】:

对象几乎是一个传递引用。它更多的是通过引用的副本传递。但这是一个相当小的细节 - 它仅意味着如果您在函数 obj = null 中接受参数 obj 并不会消除实际对象。除此之外 - 你是对的,尤其是 new Number 不是一种解决方法。 `@vlaz 完全同意,但也许换个角度想。我很久以前打折“所有参数都按值传递(复制操作),除了通过引用传递的对象”,而是支持“所有参数都按值传递,包括对象数据类型,因为对象数据类型包含对对象的引用存储在其他地方的数据。” ;-)

以上是关于通过引用javascript传递原始变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中原始值和引用值传递

JavaScript 是按引用传递还是按值传递语言?

JavaScript--函数-按值传递

如何通过引用有状态小部件来传递数据?我想更改有状态小部件中的变量并更新原始变量

JavaScript函数参数按引用存储[重复]

JavaScript 是不是通过引用传递? [复制]