定義
ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的侠仇。也就是說从隆,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)蝎宇,就和把值從一個變量復(fù)制到另一個變量一樣。
一蟋软、按值傳遞
據(jù)一個簡單的例子:
var value = 1;
function foo(v) {
v = 2;
console.log(v) //2
}
foo(value);
console.log(value) //1
很好理解褂萧,當(dāng)傳遞 value 到函數(shù) foo 中耗啦,相當(dāng)于拷貝了一份 value,函數(shù)中修改傳入的值凉唐,函數(shù)外面的值不改變碌冶。
二湿痢、引用傳遞
拷貝雖然很好理解,但是當(dāng)值是一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的時候扑庞,拷貝就會產(chǎn)生性能上的問題譬重。
所謂按引用傳遞,就是傳遞對象的引用罐氨,函數(shù)內(nèi)部對參數(shù)的任何改變都會影響該對象的值臀规,因?yàn)閮烧咭玫氖峭粋€對象。
舉個例子:
var obj = {
value: 1
}
function foo(o) {
o.value = 2;
console.log(o.value) //2
}
foo(obj);
console.log(obj.value) //2
高程上說所有函數(shù)參數(shù)傳遞都是按值傳遞栅隐,為什么按引用傳遞成功了呢塔嬉?究竟是否按引用傳遞呢玩徊?
三、共享傳遞
看個例子:
var obj = {
value: 1
}
function foo(o) {
o = 2;
console.log(o) //2
}
foo(obj);
console.log(obj.value) //1
可以看到直接更改傳入o的值谨究,外層的值并沒有改變恩袱,所以并不是按引用傳遞。
注意:按引用傳遞是傳遞對象的引用胶哲,按共享傳遞傳遞的是對象的副本
共享傳遞是傳遞對象引用的副本畔塔,所以修改o.value的值可以通過引用找到原值,直接修改o鸯屿,并不會修改原值澈吨。
傳遞副本也是一種按值傳遞,所以都叫按值傳遞碾盟。