前言
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)
