javascript中的變數是傳值還是傳址的?

來源:互聯網
上載者:User

這個標題念起來有點拗口,但卻是理解資料結構的關鍵。標題中的4個術語,對應的英文分別是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。傳址和傳引用是一回事。

一門程式設計語言的核心是資料結構,粗略來講,可以把資料結構分成不可變類型(immutable)和可變類型(mutable)。為什麼這麼分呢?這涉及到記憶體配置問題。對於不可變類型,只要分配有限的記憶體空間即可,而對於不可變類型,理論上則要分配沒有大小限制的空間。因此,這麼分是出於合理利用系統資源的考慮。實際上,堆記憶體和棧記憶體分別用於儲存不可變類型值和可變類型值。

什麼是不可變類型?就是該值一旦賦予某個變數,就只屬於某個變數,不能同屬於其他變數。如: 複製代碼 代碼如下:window.onload=function()
{

var stringValue = "淡淡的";
var anotherStringValue = stringValue;
stringValue = "I have changed";
alert(stringValue);// 輸出 I have changed
alert(anotherStringValue);// 輸出 淡淡的

此時,anotherStringValue中儲存的值會不會也變成“I have changed”?不會。因為

var anotherStringValue = stringValue;

照stringValue中儲存的字串的原樣,複製一個字串(相應地,在記憶體中分配一塊新空間),並將該字串賦給anotherStringValue。換句話說,這兩個變數雖然儲存的值相同,但它們的值並不在一塊記憶體中。因此,修改任何一個變數,都不會影響另一個變數。即

stringValue = “I have changed”;

只會影響stringValue的值。但是,確切來講,stringValue = “I have changed”;並不是修改stringValue,而是建立了一個新字串(相應地,在記憶體中分配一塊新空間),然後讓stringValue引用該字串——更像是替換變數的值;原來的字串呢?因為沒有變數引用它,也就成為垃圾了(當然,垃圾所佔用的記憶體會被回收)。

由此可見,賦值操作對於不變類型而言,傳遞的是記憶體中的值本身。那麼,對於可變類型呢?當然,傳遞的是記憶體中值的引用(或者說地址),而且無論傳遞多少次,記憶體中始終都只有一份原始值——畢竟可變類型大小莫測,只儲存一份原始值能最大限度節省記憶體空間。例如: 複製代碼 代碼如下:window.onload=function()
{
var objectValue = {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}};
var anotherObjectValue = objectValue;
objectValue[1] = 100;
alert(anotherObjectValue[1]); //輸出 100

}

不言自明,這裡的anotherObjectValue通過賦值操作,從objectValue那裡只獲得了對原始對象( {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}})的引用,也就是該對象在記憶體中的地址,或者說“門牌號碼”。因此,通過objectValue修改原始對象的第一個元素(objectValue[1] = 100;),結果同樣會在anotherObjectValue[1]那裡得到反映——因為這兩個變數共用同一份原始值。

在JavaScript中,給函數傳遞參數是按照上述預設約定——即對不可變類型,傳值;對可變類型,傳址——進行的。如:

function example(str, obj){
……
}
example(stringValue,objectValue);

調用example函數時,第一個參數傳遞的是實際的字串值,第二參數傳遞的是對象的引用(記憶體位址)。

相關文章

聯繫我們

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