欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

JavaScript中函數都是值傳遞嗎?

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

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

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

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

語言設計層面

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

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

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

函數調用角度

假設我們不理會語言對于基本類型或者值類型的設計,單單從函數調用角度看呢?

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

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

總結

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