值傳遞在不同層面有不同的意義!
你可以認為JavaScript的函數調用參數都是值傳遞,也可以認為分值傳遞和引用傳遞兩種!這兩種情況下
如果你能明白我下面說的,就不會再在這上面困惑,換到其它語言也同理。
語言設計層面
JavaScript的類型設計里有基本類型(值類型)和引用類型兩種,基本類型分配在堆棧,或者
從語言層次表現上來看:函數的參數傳遞,值類型會被復制一份,引用類型的引用會被復制一份,此時兩個引用指向同一個副本。如果你訪問或修改引用類型的數據字段,實際上修改的是同一份數據。這個比較容易理解吧?
所以從這個層面上可以說分值傳遞和引用傳遞兩種。這里的值傳遞和引用傳遞其實包含了語言特性在里面。
函數調用角度
假設我們不理會語言對于基本類型或者值類型的設計,單單從函數調用角度看呢?
通過上面的描述,你已經知道,值類型被復制了一份,引用也被復制了一份,從函數自身的角度出發,它只完成了復制功能,對于基本類型,它復制基本類型代表的數據,對于引用類型,它復制引用類型的引用(如果放在C語言,把引用換成指針可能更直觀)。
本質上來看,函數調用在參數處理這一塊,只做了復制處理,所以你可以說它是值傳遞。只不過這里的值其實包含了上面語言層面的兩個東西:值類型的值、引用或指針。
總結
統一概念的內涵是我們程序員碰到的最大問題,這里的值傳遞就是典型的問題。本質只有一個,但是大家站在不同角度,不同層次,就會賦予概念不同的內涵,如果內涵都不同,就來討論結論問題,是沒有結果的。