nodejs項目中遇到此問題了,具體啥需求暫時不說~
本博文,關於理論部分,主要是摘抄"推薦文獻"第一篇;關於實驗部分是看該博文以前作的,二者無干系。javascript
【結論】對於普通函數,javascript的傳參不是call by reference(按引用)而是 call by sharing(按共享傳遞)。
最終我想知道的結果就是,函數內部的操做是能夠【修改】原傳遞的參數對象的值的。java
形參會把實參的內存拷貝一下,這時形參和實參是兩塊內存,因此修改形參的內存,不會影響到實參的內存。因此形參的改變不會影響到實參。例如上面的num變量,能夠看作將num的內存複製給形參num,這時候值爲10的內存有兩塊,函數內部操做的是形參的內存,與函數外的內存無關。node
首先實參自己就是一個保存內存地址的變量(注意並非直接的內存而是內存所在的地址),而後形參將這個指向內存的地址拷貝下來給形參,此時內存只有一塊,只是有兩個引用指向它。因此當你修改它的內存時候其實影響到了兩個引用。
例如上面代碼中的obj1修改name屬性時,由於person1和obj1的name的屬性保存的都是一塊內容爲」張三」的內存,因此當咱們修改它的時候,person1和obj1都會被影響到。函數
按共享傳遞.net
它與引用傳遞的不一樣是,引用並無內存,例如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)