js參數傳遞

來源:互聯網
上載者:User

標籤:

概述: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參數傳遞

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.