【问题标题】:Passing primitive variables by refence javascript [duplicate]通过引用javascript传递原始变量[重复]
【发布时间】: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
  • In other OO languages, we can pass "pointers" or "references" to functions 几乎没有。例如,Java 甚至没有函数(无论如何都不是真正的函数——Java 8 在类上具有语法糖)。问题是,您为什么希望能够通过引用传递?这样做有什么好处?

标签: javascript node.js function reference


【解决方案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 完全同意,但也许换个角度想。我很久以前打折“所有参数都按值传递(复制操作),除了通过引用传递的对象”,而是支持“所有参数都按值传递,包括对象数据类型,因为对象数据类型包含对对象的引用存储在其他地方的数据。” ;-)
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 2011-06-03
  • 2019-11-21
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多