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)
我在哪里可以找到哪些变量可以像第一个例子一样工作,哪个像第二个?(布尔,字符串等...有太多的东西可以通过恶误来测试它们)
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等语言中无法实现的功能.以上陈腐的例子是一个.