JavaScript傳遞變數: 值傳遞?引用傳遞?

來源:互聯網
上載者:User

當變數A賦值給變數B時,會將棧中的值複製一份到為新變數分配的空間中。

如何理解? 複製代碼 代碼如下:var x = y = 1;
y = 2;
alert(x);

x的值為多少? 複製代碼 代碼如下:var obj = {};
var sub = {};
sub['id'] = 3;
obj['sub'] = sub;
sub['id'] = 4;
alert(obj['sub']['id']);

obj['sub']['id']的值又為多少?他們真的符合你的預期嗎?

我們分別運行2段代碼,發現第1段程式中x的值沒有改變,而第2段程式中的obj['sub']['id']的值卻改變了。同樣是一個賦值操作,同樣是修改另外一份拷貝的值,為什麼一段程式源變數沒變,一段程式源變數變化了呢?這個傳遞到底是按值傳遞還是按引用傳遞的呢?

李松峰翻譯的《JavaScript 進階程式設計 第二版》中給出了答案。
在開始的這2個例子中,事實上都複製了A的值給B,不同的是,在第一個例子中,A的值是int型的1,而在第二個例子中,A的值是一個地址指標,這個地址指標可以訪問到一個對象,複製之後,第1個例子中的B的值變成了新的int, 他的值為1,而第2個例子中B的值變成了新的地址指標,他的值為這個對象的地址。

下面的例子可以協助理解 複製代碼 代碼如下:function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);

可以看到的是,儘管調用了setName函數修改了變數的name屬性,但是person.name的值並沒有改變。這是因為在函數中,obj指向的地址被改變了,因此修改這個地址的name屬性,並不會對原地址的name屬性造成影響。從另一個方面,也印證了JavaScript的傳遞是按值傳遞。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.