了解变量的传递方式

aja*_*221 0 javascript variables pass-by-reference pass-by-value

我只是无法理解变量是如何传递的,为什么有些是通过引用传递而另一些是通过值传递的?

例:

var a=4;
var b=a;
b=b++;
alert(a);//unmodified 4

var c=["t","ttt"];
var d=c;
d=d.sort(function(x,y){return (y.length-x.length);});
alert(c);//modified ["ttt","t"]
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到哪些变量可以像第一个例子一样工作,哪个像第二个?(布尔,字符串等...有太多的东西可以通过恶误来测试它们)

Mat*_*eer 6

JavaScript 总是按值传递.

很常见的是,JavaScript中的对象是通过引用传递的,但事实并非如此.在通过引用语言进行的真正传递中,您可以传递对对象引用的引用,并将其指向另一个对象.这在JavaScript中是不可能的.

以C#为例.默认情况下,C#中的所有内容都按值传递,就像JavaScript一样.

void foo(string s) {
    s = "passbyvalue";
}

string a = "original value";
foo(a);
// a is still "original value"
Run Code Online (Sandbox Code Playgroud)

但是,如果您更改foo为使用按引用传递,则行为会更改:

void foo(ref string s) {
    s = "passbyreference";
}
string a = "original value";
foo(ref a);
// a is now "passbyreference"  
Run Code Online (Sandbox Code Playgroud)

在JavaScript中,只有第一个例子是可能的.

在JavaScript中,一切都是按值传递的.这包括对象引用(是的,它令人困惑).引用本身是一个值(它非常像指针).它只包含一个id,允许运行时查找最有可能存储在其堆中的对象.将对象传递给函数时,实际上是将其引用复制到函数中

它可能是一个看似很小,甚至是肛门的差异.但这是一个关键的区别.真正通过引用传递的语言(如C#和C++)允许您执行在JavaScript等语言中无法实现的功能.以上陈腐的例子是一个.