国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-21 00:33:48
字體:
來源:轉載
供稿:網友
這個標題念起來有點拗口,但卻是理解數據結構的關鍵。標題中的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函數時,第一個參數傳遞的是實際的字符串值,第二參數傳遞的是對象的引用(內存地址)。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延川县| 商丘市| 竹山县| 文登市| 荔波县| 洪雅县| 黄浦区| 西吉县| 闻喜县| 黄山市| 达州市| 象州县| 博爱县| 靖边县| 山丹县| 龙海市| 芜湖县| 宁化县| 新竹县| 兴海县| 黄冈市| 大田县| 阜新| 壶关县| 长寿区| 河西区| 伊春市| 乌什县| 台北市| 阿城市| 孝昌县| 庆安县| 元氏县| 大方县| 海原县| 绍兴县| 渝北区| 阳江市| 浪卡子县| 武乡县| 报价|