原由是在逛sf的時候看到這樣一個問題編程
var arr=[1,2]; var arr0=[{a:1,b:2}]; function fun(data){ data = arr0 } fun(arr); console.log(arr) //[1,2],這裏的arr的值爲何沒有變?
一看這個問題,似懂非懂。後經討論和高人指定,畫了下內存圖,感受瞬間清晰了。和你們分享下,歡迎指正!segmentfault
初始的內存分佈,形參變量存在棧中,對象存在堆內。如圖,棧中有arr,arr0,還有fun的形參data三個變量,分別指向了堆中的兩個數組對象的首地址。
執行fun(arr);
,將arr數組對象的首地址做爲實參傳入fun中,此時,data的指向發生變化,指向了arr數組對象的首地址。如圖,
最後console.log(arr);
,輸出arr,因爲arr依然指向的是原來的arr數組對象,因此輸出沒有變化。數組
那麼,再看下另外的狀況spa
var arr=[1,2]; var arr0=[{a:1,b:2}]; function fun(data){ data[0] = 3; data[1] = 4; } fun(arr); console.log(arr) //[3,4],這裏的arr的值爲何又變了呢?
直接開始fun(arr);
,data指向arr數組對象的首地址,拿到了arr對象的操做權限。方法內部,data對arr數組對象的值進行了修改(暫不考慮越界的問題)。結果如圖,
因此最後arr被改變了。指針
兩種代碼不一樣的地方是,一個沒改變對象自己,只是指針發生了變化。另外一個是用心的指針操做了對象,因此原指針指向的數據就發生了變化。另外存在引用傳遞和值傳遞的誤區。code
編程的道路,由於分享愈來愈寬!對象
參考:
https://segmentfault.com/q/10...
https://segmentfault.com/q/10...blog