JavaScript之參數傳遞方式


前言

nodejs項目中遇到此問題了,具體啥需求暫時不說~
本博文,關於理論部分,主要是摘抄"推薦文獻"第一篇;關於實驗部分是看該博文之前做的,兩者無干系。

【結論】對於普通函數,javascript的傳參不是call by reference(按引用)而是 call by sharing(按共享傳遞)。
最終我想知道的結果就是,函數內部的操作是可以【修改】原傳遞的參數對象的值的。

  • 按值傳遞:

形參會把實參的內存拷貝一下,這時形參和實參是兩塊內存,所以修改形參的內存,不會影響到實參的內存。所以形參的改變不會影響到實參。例如上面的num變量,可以看做將num的內存復制給形參num,這時候值為10的內存有兩塊,函數內部操作的是形參的內存,與函數外的內存無關。

  • 按引用傳遞:

首先實參本身就是一個保存內存地址的變量(注意並不是直接的內存而是內存所在的地址),然后形參將這個指向內存的地址拷貝下來給形參,此時內存只有一塊,只是有兩個引用指向它。所以當你修改它的內存時候其實影響到了兩個引用。
例如上面代碼中的obj1修改name屬性時,因為person1和obj1的name的屬性保存的都是一塊內容為”張三”的內存,所以當我們修改它的時候,person1和obj1都會被影響到。

  • 按共享傳遞

它與引用傳遞的不同是,引用並沒有內存,例如c語言中的指針,只是一個指向;但是共享傳遞不是,它會將實參的所在的地址也拷貝進來,這個變量本身就可以看做一個內存,只是這個內存的一個值保存另一塊內存的地址。所以我們可以運行上面的函數發現,obj2的值變了,但是person2沒有任何影響,因為此時它們是兩塊不同的內存,而person1和obj1之所以可以變,是因為person1和obj1兩塊內存中的一個name所在的區域保存了指向一塊內容為”張三”的內存的引用(內存地址),並且這塊內存是惟一的,所以obj1表現的像是引用傳遞。

實驗

function test(obj){
	obj.name = "jack";
}
gg = {name:"3532",age:67};
test(obj);

console.log(gg)

推薦文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM