以下內容來源:https://wangdoc.com/javascript/types/function.html#%E6%A6%82%E8%BF%B0-1
函數(shù)參數(shù)如果是原始類型的值(數(shù)值沪蓬、字符串狐树、布爾值)斋陪,傳遞方式是傳值傳遞(passes by value)。這意味著,在函數(shù)體內修改參數(shù)值忠售,不會影響到函數(shù)外部。
var p = 2;
function f(p) {
p = 3;
}
f(p);
p // 2
上面代碼中,變量p是一個原始類型的值呼巷,傳入函數(shù)f的方式是傳值傳遞。因此赎瑰,在函數(shù)內部王悍,p的值是原始值的拷貝,無論怎么修改餐曼,都不會影響到原始值压储。
但是,如果函數(shù)參數(shù)是復合類型的值(數(shù)組晋辆、對象渠脉、其他函數(shù)),傳遞方式是傳址傳遞(pass by reference)瓶佳。也就是說芋膘,傳入函數(shù)的原始值的地址,因此在函數(shù)內部修改參數(shù)霸饲,將會影響到原始值为朋。
var obj = { p: 1 };
function f(o) {
o.p = 2;
}
f(obj);
obj.p // 2
上面代碼中,傳入函數(shù)f的是參數(shù)對象obj的地址厚脉。因此习寸,在函數(shù)內部修改obj的屬性p,會影響到原始值傻工。
注意霞溪,如果函數(shù)內部修改的孵滞,不是參數(shù)對象的某個屬性,而是替換掉整個參數(shù)鸯匹,這時不會影響到原始值坊饶。
var obj = [1, 2, 3];
function f(o) {
o = [2, 3, 4];
}
f(obj);
obj // [1, 2, 3]
上面代碼中,在函數(shù)f()內部殴蓬,參數(shù)對象obj被整個替換成另一個值匿级。這時不會影響到原始值。這是因為染厅,形式參數(shù)(o)的值實際是參數(shù)obj的地址痘绎,重新對o賦值導致o指向另一個地址,保存在原地址上的值當然不受影響肖粮。