色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

JavaScript中函數(shù)都是值傳遞嗎?

吉茹定2年前10瀏覽0評論

值傳遞在不同層面有不同的意義!

你可以認(rèn)為JavaScript的函數(shù)調(diào)用參數(shù)都是值傳遞,也可以認(rèn)為分值傳遞和引用傳遞兩種!這兩種情況下值傳遞的含義并不同,但是后者是大部分程序員最先接觸的。

如果你能明白我下面說的,就不會再在這上面困惑,換到其它語言也同理。

語言設(shè)計(jì)層面

JavaScript的類型設(shè)計(jì)里有基本類型(值類型)和引用類型兩種,基本類型分配在堆棧,或者依附于引用類型存儲在堆中。看到值類型存儲在堆中,估計(jì)很多人就要開始吐槽了!但是要冷靜,從內(nèi)存角度好好想一想引用類型的實(shí)例到底是什么?它不過是一堆值類型和內(nèi)嵌其它引用類型的組合而已。這樣遞歸想下去,你會明白,最終的數(shù)據(jù)都是靠基本的值類型來承載的。也就是堆里面除了少部分引用對應(yīng)的數(shù)據(jù)結(jié)構(gòu),大部分都是值類型數(shù)據(jù)。在考慮值類型和引用類型的區(qū)別時,你考慮過這點(diǎn)么?

從語言層次表現(xiàn)上來看:函數(shù)的參數(shù)傳遞,值類型會被復(fù)制一份,引用類型的引用會被復(fù)制一份,此時兩個引用指向同一個副本。如果你訪問或修改引用類型的數(shù)據(jù)字段,實(shí)際上修改的是同一份數(shù)據(jù)。這個比較容易理解吧?

所以從這個層面上可以說分值傳遞和引用傳遞兩種。這里的值傳遞和引用傳遞其實(shí)包含了語言特性在里面。

函數(shù)調(diào)用角度

假設(shè)我們不理會語言對于基本類型或者值類型的設(shè)計(jì),單單從函數(shù)調(diào)用角度看呢?

通過上面的描述,你已經(jīng)知道,值類型被復(fù)制了一份,引用也被復(fù)制了一份,從函數(shù)自身的角度出發(fā),它只完成了復(fù)制功能,對于基本類型,它復(fù)制基本類型代表的數(shù)據(jù),對于引用類型,它復(fù)制引用類型的引用(如果放在C語言,把引用換成指針可能更直觀)。

本質(zhì)上來看,函數(shù)調(diào)用在參數(shù)處理這一塊,只做了復(fù)制處理,所以你可以說它是值傳遞。只不過這里的值其實(shí)包含了上面語言層面的兩個東西:值類型的值、引用或指針。

總結(jié)

統(tǒng)一概念的內(nèi)涵是我們程序員碰到的最大問題,這里的值傳遞就是典型的問題。本質(zhì)只有一個,但是大家站在不同角度,不同層次,就會賦予概念不同的內(nèi)涵,如果內(nèi)涵都不同,就來討論結(jié)論問題,是沒有結(jié)果的。