值傳遞在不同層面有不同的意義!
你可以認(rèn)為JavaScript的函數(shù)調(diào)用參數(shù)都是值傳遞,也可以認(rèn)為分值傳遞和引用傳遞兩種!這兩種情況下
如果你能明白我下面說的,就不會再在這上面困惑,換到其它語言也同理。
語言設(shè)計(jì)層面
JavaScript的類型設(shè)計(jì)里有基本類型(值類型)和引用類型兩種,基本類型分配在堆棧,或者
從語言層次表現(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é)果的。