用JavaScript指针?

use*_*369 76 javascript

我们可以传递一个变量的引用,该变量在函数中作为参数不可变吗?

例:

var x = 0;
function a(x)
{
    x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
Run Code Online (Sandbox Code Playgroud)

Mik*_*sen 131

由于JavaScript不支持通过引用传递参数,因此您需要将变量设为对象:

var x = {Value: 0};

function a(obj)
{
    obj.Value++;
}

a(x);
document.write(x.Value); //Here i want to have 1 instead of 0
Run Code Online (Sandbox Code Playgroud)

在这种情况下,x是对象的引用.当x被传递给函数a,该引用复制到obj.因此,objx在内存中引用相同的东西.改变Value属性obj会影响Value属性x.

Javascript将始终按值传递函数参数.这只是语言的规范.您可以x在两个函数的本地范围内创建,而不是传递变量.

  • 嘿,谢谢你向我介绍[关于SO的代码片段](http://meta.stackoverflow.com/q/269753/1256925).在我看到你的答案中使用它之前没有听说过它们. (6认同)

n00*_*dle 19

这个问题可能会有所帮助: 如何在javascript中通过引用传递变量?从ActiveX函数读取数据,返回多个值

总而言之,Javascript基元类型总是按值传递,而对象内部的值通过引用传递(感谢评论者指出我的疏忽).所以为了解决这个问题,你必须将整数放在一个对象中:

var myobj = {x:0};

function a(obj)
{
    obj.x++;
}

a(myobj);
alert(myobj.x); // returns 1

  
Run Code Online (Sandbox Code Playgroud)

  • 对象变量也总是按值传递 - 它只是*值是对象的引用*.*通过引用*和*通过值*传递引用之间存在差异.也就是说,当您通过值传递`x`时,无论`x`是否为对象,您都无法以调用者将看到的任何方式将其替换为其他值. (2认同)

Wil*_*ver 13

我发现一种稍微不同的实现指针的方式,从C角度来看可能更通用,更容易理解(因此更适合用户示例的格式).

在JavaScript中,就像在C中一样,数组变量实际上只是指向数组的指针,因此您可以使用数组与声明指针完全相同.这样,尽管您在原始对象中命名了变量,但代码中的所有指针都可以以相同的方式使用.

它还允许一个人使用两个不同的符号,指的是指针的地址和指针地址的内容.

这是一个例子(我用下划线表示一个指针):

var _x = [ 10 ];

function foo(_a){
    _a[0] += 10;
}

foo(_x);

console.log(_x[0]);
Run Code Online (Sandbox Code Playgroud)

产量

output: 20
Run Code Online (Sandbox Code Playgroud)


小智 8

你从window对象中引用'x'

var x = 0;

function a(key, ref) {
    ref = ref || window;  // object reference - default window
    ref[key]++;
}

a('x');                   // string
alert(x);
Run Code Online (Sandbox Code Playgroud)