我试图通过引用传递原始变量。
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 :(得分:8)
您无法通过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
的memmory,而不是foo
。如果您在通话后检查foo
的原始值,它仍为2.
实际上,您可以使用递增的foo属性传递对象的引用:
var obj = {}
obj.foo = 2
function incFoo (obj) {
obj.foo++
}
incFoo() // obj.foo now 3
基本上,ECMA脚本中没有可用于引用原始值的地址指针。