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

时间:2010-05-14 14:52:06

标签: javascript

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

如果是/不是javascript如何运作?

谢谢大家。

5 个答案:

答案 0 :(得分:27)

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

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

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

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

function testChangeCaller() {

    var x = "foo";

    changeCaller(x);

    alert(x); // still "foo"

}

testChangeCaller();

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

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();

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

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();

希望这有帮助!

答案 1 :(得分:15)

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

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

有些人将此行为称为“引用价值”

比较 - PHP

$foo = "foo";
$bar = &$foo;  // assign by reference
$bar = "bar";
echo $foo; // -> output: "bar"

的JavaScript

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

答案 2 :(得分:2)

关于讨论,除了Pointy评论之外,关于“价值”和“参考”的考虑是错误的。 像c#或java这样的其他引用语句的Javascript,不会将变量本身的引用传递给方法,而是传递变量引用的对象的引用。 这里的人们期待的是,传递指向引用对象的变量的指针,传递指针与通过引用传递不一样,并且肯定与传递值不一样。

此处预期的行为是通过指针传递的。 按引用传递发送对象的引用。 通过值复制存储在变量中的对象并传递副本 方法。

答案 3 :(得分:1)

通过价值传递,通过参考讨论传递是一个邪恶的模因。这个邪恶的模因也出现在Java讨论中。

很简单:将值的位模式复制到参数中。如果位模式是一个int或者它是一个对象的地址也没关系 - 它只是一点一点地复制到参数中。这简直太简单了。运行时没有为基元和引用做一些特殊的事情。它只是,而且总是只是复制价值。

计算机科学术语是“通过价值传递。”

通过引用传递不再用于编程。在较旧的语言中,如Pascal,您可以编写一个函数来直接更改调用例程中的值。因此,例如,调用例程中的int变量可以在被调用函数中更改。

答案 4 :(得分:0)

原始值通过值传递,对象通过引用传递。

字符串是不可变的,因此它们通过引用传递,尽管它们被认为是原始类型。