2016-09-19 68 views
2

我想通过引用传递基元变量。通过refence传递基元变量javascript

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中有这样的东西吗?谢谢!

+0

你在问什么? JavaScript中没有对基元进行传递引用。 – Cristy

+0

真正的问题在于你应该阅读关于JS如何工作的范围。一个简单的链接:http://www.w3schools.com/js/js_scope.asp – manuerumx

+0

更好的链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures – manuerumx

回答

3

您无法在Javascript中通过引用传递基元 - 而示例“解决方法”不起作用。这里的原因:

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

线1套foo与原始值的数字对象包装2.

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脚本中可用于引用原始值的指针。

+1

对象几乎是通过引用传递的。它更像是一个引用的副本。但是这只是一个相当小的细节 - 它只意味着如果你在函数中接受一个参数'obj','obj = null'不会清除实际的对象。除此之外 - 你是对的,特别是关于'新号码'不是一个解决方法。 – vlaz

+0

'@vlaz完全同意但可能用不同的术语来思考。我很久以前打折了“所有参数都是按值传递的(复制操作),除了通过引用传递的对象”有利于“所有参数都是按值传递的,包括对象数据类型,因为对象数据类型包含对对象的引用数据存储在别处。“ ;-) – traktor53