標籤:
概述:js中的參數傳遞有兩種方式,對於基礎資料型別 (Elementary Data Type)而言是按照值傳遞的,而對於對象而言是按照共用傳遞的(調用函數傳參時,函數接受對象實參引用的副本,既不是按值傳遞的對象副本,也不是按引用傳遞的隱式引用。它和按引用傳遞的不同在於:在共用傳遞中對函數形參的賦值,不會影響實參的值)
可以通過如下代碼證明js中基礎資料型別 (Elementary Data Type)是按照值傳遞的:code-1
var tmp=0;
function change(data){
data=‘hello‘;
}
change(tmp);
console.log(tmp);
這段代碼輸出為0;很明顯形參是實參值的一份拷貝而已。
至於js中對象是按照共用傳遞的可以通過下面這段代碼來說明:code-2
var obj = {x: 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj並未被修改為100.這說明js參數不是按照引用傳遞的(如果是按照引用傳遞則obj就被改為數值對象
如果js對象參數是按照引用傳遞的則上述代碼中的obj對象就會被賦值為100(基礎資料型別 (Elementary Data Type)),可是上述代碼輸出為1,這說明obj仍然是一個對象(並沒有變為一個基礎資料型別 (Elementary Data Type)),可見js中的對象參數不是按照引用傳遞的;
再來看一段代碼:code-3
var obj = {x: 1};
function foo(o) {
o.x = 100;
}
foo(obj);
console.log(obj.x); //輸出為100
這就讓人有點迷惑了,不是說js對象參數不是按照引用傳遞的嗎?為什麼在函數內部可以改變對象的屬性呢?其實這個主要是因為js對象是按照共用傳遞的,即形參是對象實參引用的副本,實參引用和形參(實參引用的副本)都指向同一個對象,所以可以通過實參引用副本來改變對象的屬性,但是改變形參本身並不會對實參指向的對象有任何影響(這也就是為什麼code-2的輸出為1)
js參數傳遞