1. 程式人生 > >以js為例解釋按值傳遞和按引用傳遞

以js為例解釋按值傳遞和按引用傳遞

引用大神的一篇文章,個人覺得寫得極好,故記錄下來。點選開啟連結

首先“ EMCAJavaScrip裡面所有函式的引數傳遞都是按值傳遞” 這句話是公認的,沒錯的。

按值傳遞的意思就是形參是實參的複製。

按引用傳遞是 函式的形參接收實參的隱式引用,而不再是副本。這意味著函式形參的值如果被修改,實參也會被修改。同時兩者指向相同的值。

但是由於js中有簡單資料型別,複雜資料型別。簡單資料型別不用細說,很容易理解他的按值傳遞就是基本型別的複製,形參實參互不干擾。複雜資料型別複製:需要強調的一點是,儲存物件的變數,它裡面裝的值是這個物件在堆記憶體中的地址。

所以在物件變數進行復制時,obj1和obj2都指向同一記憶體地址,所以在引數傳遞中,形參和實參指向同一記憶體地址,當改變形參的屬性時,實參屬性也變了。但是!!!如果直接改變形參本身,比如重新給形參分配一塊記憶體,那麼此時形參的改變就影響不到實參。所以複雜資料型別在傳遞時也並不是按照引用傳遞的。

這種傳遞就是傳說中的按共享傳遞 call by sharing

大神的文章裡很清楚的寫了這種傳遞,所以嚴格意義上來說,JS中基本型別按值傳遞,物件型別按共享傳遞的,這種傳遞也被應用在Java、Python中。

仔細看大神寫的文章,思路會清晰很多。