欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2010年04月19日 21:39:03   作者:  
一門(mén)編程語(yǔ)言的核心是數(shù)據(jù)結(jié)構(gòu),粗略來(lái)講,可以把數(shù)據(jù)結(jié)構(gòu)分成不可變類(lèi)型(immutable)和可變類(lèi)型(mutable)。
這個(gè)標(biāo)題念起來(lái)有點(diǎn)拗口,但卻是理解數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵。標(biāo)題中的4個(gè)術(shù)語(yǔ),對(duì)應(yīng)的英文分別是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。傳址和傳引用是一回事。

一門(mén)編程語(yǔ)言的核心是數(shù)據(jù)結(jié)構(gòu),粗略來(lái)講,可以把數(shù)據(jù)結(jié)構(gòu)分成不可變類(lèi)型(immutable)和可變類(lèi)型(mutable)。為什么這么分呢?這涉及到內(nèi)存分配問(wèn)題。對(duì)于不可變類(lèi)型,只要分配有限的內(nèi)存空間即可,而對(duì)于不可變類(lèi)型,理論上則要分配沒(méi)有大小限制的空間。因此,這么分是出于合理利用系統(tǒng)資源的考慮。實(shí)際上,堆內(nèi)存和棧內(nèi)存分別用于保存不可變類(lèi)型值和可變類(lèi)型值。

什么是不可變類(lèi)型?就是該值一旦賦予某個(gè)變量,就只屬于某個(gè)變量,不能同屬于其他變量。如:
復(fù)制代碼 代碼如下:

window.onload=function()
{

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


此時(shí),anotherStringValue中保存的值會(huì)不會(huì)也變成“I have changed”?不會(huì)。因?yàn)?

var anotherStringValue = stringValue;

照stringValue中保存的字符串的原樣,復(fù)制一個(gè)字符串(相應(yīng)地,在內(nèi)存中分配一塊新空間),并將該字符串賦給anotherStringValue。換句話(huà)說(shuō),這兩個(gè)變量雖然保存的值相同,但它們的值并不在一塊內(nèi)存中。因此,修改任何一個(gè)變量,都不會(huì)影響另一個(gè)變量。即

stringValue = “I have changed”;

只會(huì)影響stringValue的值。但是,確切來(lái)講,stringValue = “I have changed”;并不是修改stringValue,而是創(chuàng)建了一個(gè)新字符串(相應(yīng)地,在內(nèi)存中分配一塊新空間),然后讓stringValue引用該字符串——更像是替換變量的值;原來(lái)的字符串呢?因?yàn)闆](méi)有變量引用它,也就成為垃圾了(當(dāng)然,垃圾所占用的內(nèi)存會(huì)被回收)。

由此可見(jiàn),賦值操作對(duì)于不變類(lèi)型而言,傳遞的是內(nèi)存中的值本身。那么,對(duì)于可變類(lèi)型呢?當(dāng)然,傳遞的是內(nèi)存中值的引用(或者說(shuō)地址),而且無(wú)論傳遞多少次,內(nèi)存中始終都只有一份原始值——畢竟可變類(lèi)型大小莫測(cè),只保存一份原始值能最大限度節(jié)省內(nèi)存空間。例如:
復(fù)制代碼 代碼如下:

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通過(guò)賦值操作,從objectValue那里只獲得了對(duì)原始對(duì)象( {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}})的引用,也就是該對(duì)象在內(nèi)存中的地址,或者說(shuō)“門(mén)牌號(hào)碼”。因此,通過(guò)objectValue修改原始對(duì)象的第一個(gè)元素(objectValue[1] = 100;),結(jié)果同樣會(huì)在anotherObjectValue[1]那里得到反映——因?yàn)檫@兩個(gè)變量共享同一份原始值。

在JavaScript中,給函數(shù)傳遞參數(shù)是按照上述默認(rèn)約定——即對(duì)不可變類(lèi)型,傳值;對(duì)可變類(lèi)型,傳址——進(jìn)行的。如:

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

調(diào)用example函數(shù)時(shí),第一個(gè)參數(shù)傳遞的是實(shí)際的字符串值,第二參數(shù)傳遞的是對(duì)象的引用(內(nèi)存地址)。

相關(guān)文章

  • javascript算法學(xué)習(xí)(直接插入排序)

    javascript算法學(xué)習(xí)(直接插入排序)

    假設(shè)待排序的記錄存放在數(shù)組R[1..n]中。初始時(shí),R[1]自成1個(gè)有序區(qū),無(wú)序區(qū)為R[2..n]。從i=2起直至i=n為止,依次將R[i]插入當(dāng)前的有序區(qū)R[1..i-1]中,生成含n個(gè)記錄的有序區(qū)。
    2011-04-04
  • H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決

    H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決

    這篇文章主要為大家介紹了H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • JavaScript function 的 length 屬性使用介紹

    JavaScript function 的 length 屬性使用介紹

    函數(shù)的 length 得到的是形參個(gè)數(shù),如果函數(shù)內(nèi)部是通過(guò)arguments 調(diào)用參數(shù),而沒(méi)有實(shí)際定義參數(shù)的話(huà), length 只會(huì)的得到0
    2014-09-09
  • iscroll動(dòng)態(tài)加載數(shù)據(jù)完美解決方法

    iscroll動(dòng)態(tài)加載數(shù)據(jù)完美解決方法

    這篇文章主要為大家詳細(xì)介紹了iscroll動(dòng)態(tài)加載數(shù)據(jù)的完美解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 詳解webpack進(jìn)階之loader篇

    詳解webpack進(jìn)階之loader篇

    本篇文章主要介紹了詳解webpack進(jìn)階之loader篇,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • JS偽繼承prototype實(shí)現(xiàn)方法示例

    JS偽繼承prototype實(shí)現(xiàn)方法示例

    這篇文章主要介紹了JS偽繼承prototype實(shí)現(xiàn)方法,結(jié)合實(shí)例形式對(duì)比分析了基于prototype實(shí)現(xiàn)模擬繼承的相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • 基于JS實(shí)現(xiàn)類(lèi)似支付寶支付密碼輸入框

    基于JS實(shí)現(xiàn)類(lèi)似支付寶支付密碼輸入框

    這篇文章主要介紹了基于JS實(shí)現(xiàn)類(lèi)似支付寶支付密碼輸入框功能,密碼框只準(zhǔn)輸入數(shù)字且只可以輸入6位數(shù)字,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • js事件綁定快捷鍵以ctrl+k為例

    js事件綁定快捷鍵以ctrl+k為例

    js為快捷鍵綁定事件,當(dāng)按這個(gè)快捷鍵時(shí)就會(huì)觸發(fā)事先綁定處理函數(shù),下面以ctrl+k為例與大家分享下具體的實(shí)現(xiàn)代碼
    2014-09-09
  • JavaScript與java語(yǔ)言有什么不同

    JavaScript與java語(yǔ)言有什么不同

    java和JavaScript是兩個(gè)不同的語(yǔ)言。那么這兩個(gè)語(yǔ)言有什么不同呢?下面小編通過(guò)本文給大家介紹下
    2016-09-09
  • 使用requirejs模塊化開(kāi)發(fā)多頁(yè)面一個(gè)入口js的使用方式

    使用requirejs模塊化開(kāi)發(fā)多頁(yè)面一個(gè)入口js的使用方式

    這篇文章主要介紹了使用requirejs模塊化開(kāi)發(fā)多頁(yè)面一個(gè)入口js的使用方式,需要的朋友可以參考下
    2017-06-06

最新評(píng)論