JavaScript 中的指针?

IT技术 javascript
2021-02-01 06:34:49

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

例子:

var x = 0;
function a(x)
{
    x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
6个回答

由于 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

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

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

有没有办法让另一个人这样做: var x=0;a(x); 并且该函数设置了一个具有 x 值的对象?(或类似的东西)
2021-03-20 06:34:49
如果您不知道 obj 属性的名称,例如如果它是 obj.name 那么下次您想更新 obj.surname 怎么办?如何让函数适应这种灵活性?
2021-03-20 06:34:49
嘿,感谢您向我介绍SO上的代码片段在我看到它用于您的答案之前,我没有听说过它们。
2021-04-03 06:34:49
@Joeytje50 - 是的,这个功能是在 9 月份才添加回来的。非常便利!
2021-04-09 06:34:49
@Dave 这可能是一个迟到的答案,但您可以让您的函数期望 3 个参数,即 obj、属性名称和值。请记住,您可以通过执行 obj.propertyname 或 obj['propertyname'] 来访问对象的属性,这将是您想要灵活性时所需的方式。传递 3 个参数并执行 obj['propertyname'] = value 并且这将是可重用的。
2021-04-11 06:34:49

这个问题可能有帮助: How to pass variable by reference in javascript? 从返回多个值的 ActiveX 函数读取数据

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

var myobj = {x:0};

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

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

  

而对象通过引用传递是不正确的。JavaScript 中没有任何内容是通过引用传递的。
2021-03-14 06:34:49
对象变量也总是按值传递——只是值是对对象的引用按引用传递按值传递引用是有区别的也就是说,当您通过x传递时,无论是否x为对象,您都无法以调用者将看到的任何方式将其替换为整个其他值。
2021-04-02 06:34:49
如果您按值传递灵长类动物类型(由 x 引用),为什么 x 之后不会改变,除非您传递对象
2021-04-10 06:34:49

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

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

它还允许使用两种不同的符号来表示指针地址和指针地址处的内容。

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

var _x = [ 10 ];

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

foo(_x);

console.log(_x[0]);

产量

output: 20

您从 window 对象引用“x”

var x = 0;

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

a('x');                   // string
alert(x);

迟到的答案,但我遇到了一种通过闭包通过引用传递原始值的方法。创建指针相当复杂,但它有效。

function ptr(get, set) {
    return { get: get, set: set };
}

function helloWorld(namePtr) {
    console.log(namePtr.get());
    namePtr.set('jack');
    console.log(namePtr.get())
}

var myName = 'joe';
var myNamePtr = ptr(
    function () { return myName; },
    function (value) { myName = value; }
);

helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack

在 ES6 中,可以缩短代码以使用 lambda 表达式:

var myName = 'joe';
var myNamePtr = ptr(=> myName, v => myName = v);

helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack