是否有像JavaScript一样通过引用传递的东西?

Ani*_*mde 15 javascript

当我开始在C++中学习函数时,它的全部传递值和参考.我们在javascript中有类似的东西吗?

如果是/不是如何在javascript的情况下工作?

谢谢大家.

jim*_*mbo 27

这个问题的其他答案都是正确的 - 所有变量都是在JavaScript中按值传递的,有时这个值指向一个对象.

当编程语言支持通过引用传递时,可以更改变量从函数内部指向的位置.这在JavaScript中是不可能的.

例如,请考虑此代码尝试将传递的变量重新分配给新值:

function changeCaller( x ) {
    x = "bar";  // Ha ha!
}

function testChangeCaller() {

    var x = "foo";

    changeCaller(x);

    alert(x); // still "foo"

}

testChangeCaller();
Run Code Online (Sandbox Code Playgroud)

尝试将变量指向新对象失败的方式与上述示例无法重新分配原始字符串的方式相同:

function changeCaller( x ) {
    x = new Object(); // no longer pointing to the same object
    x.a = "bar";
}

function testChangeCaller() {

    var x = new Object();
    x.a = "foo";

    changeCaller(x);

    alert(x.a); // still "foo"

}

testChangeCaller();
Run Code Online (Sandbox Code Playgroud)

导致人们相信他们正在处理引用传递方案的特征是在修改对象时.您可以对对象或数组进行更改,因为局部变量指向同一对象:

function changeCaller( x ) {
    x.a = "bar";
}

function testChangeCaller() {

    var x = new Object();
    x.a = "foo";

    changeCaller(x);

    alert(x.a); // now "bar", since changeCaller worked on the same object

}

testChangeCaller();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


And*_*y E 15

JavaScript总是按值传递,永远不会通过引用传递.由于对象的工作方式,很多人都对此感到困惑.

JavaScript中的任何变量都没有"通过引用传递"(不,即使将对象分配给该变量也不行).所有变量和参数都按值分配.如果指定的值是对象,则新变量的值是对该对象的引用,但是为新变量分配新值/对象不会影响原始变量.

有些人称这种行为通过"参考价值".

比较 - PHP

$foo = "foo";
$bar = &$foo;  // assign by reference
$bar = "bar";
echo $foo; // -> output: "bar"
Run Code Online (Sandbox Code Playgroud)

JavaScript的

foo = {"foo": true};
bar = foo;     // assign value by reference
bar = {"bar": true};
alert(JSON.stringify(foo)); // -> output: '{"foo": true}
Run Code Online (Sandbox Code Playgroud)

  • 对于所有意图和目的,对象(包括数组)通过引用传递.说"你是通过价值传递,但价值是对象的引用"是另一种说"你通过引用传递"的方式.除非你只是想让人迷惑. (62认同)
  • 不,@rob,情况并非如此.传递的*值*是引用的值.在真正的pass-by-reference语言中,编译器引入了一个在代码中不可见的指针.在传递参考语言中,您可以自然地编写臭名昭着的"交换两个整体"功能.Javascript中变量的值是*always*对对象的引用,当你调用一个函数时,你总是*传递该值.如果Number上有允许更改值的方法,那么可能会更清楚. (7认同)
  • @rob,不是**所有**意图和目的.例如,许多WMI脚本调用要求您通过引用将变量传递给函数,以便该函数的返回值可以是错误编号.而不是返回结果,它将结果分配给传入的变量.VBScript可以处理这个很好,但JScript/JavaScript不能,因为它无法传递对变量的引用.它们不是同一个东西,我不是在尝试为了让人感到困惑,我试图通过驱逐一个已经引起很多混乱的神话来让人不安. (6认同)
  • @rob:当然会有用,你误解了答案和评论.point变量的值是对象的引用,但point本身不是对传入的变量的引用.如果将`point ="设置为字符串而不是对象,则按引用传递的方式不同";`在函数内部,将修改传递给函数的原始变量.在JavaScript中,情况并非如此.通过引用传递并通过引用传递值不是一回事. (2认同)
  • @joeframbach:是的.`b`被赋予对"a"也指的同一对象的引用.也就是说,两个变量都包含对同一个对象的引用,但是`b`不是对`a`的引用.通过引用的真正传递,`b = false`也会改变`a`的值.将PHP示例(通过引用分配/传递)与JavaScript示例(按值分配/传递引用)进行比较. (2认同)