通过引用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/ClosuresIn 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传递原始变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章