經過內存分析來解釋JavaScript數組賦值問題

原由是在逛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三個變量,分別指向了堆中的兩個數組對象的首地址。
image.png
執行fun(arr);,將arr數組對象的首地址做爲實參傳入fun中,此時,data的指向發生變化,指向了arr數組對象的首地址。如圖,
image.png
最後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數組對象的值進行了修改(暫不考慮越界的問題)。結果如圖,
image.png
因此最後arr被改變了。指針

兩種代碼不一樣的地方是,一個沒改變對象自己,只是指針發生了變化。另外一個是用心的指針操做了對象,因此原指針指向的數據就發生了變化。另外存在引用傳遞和值傳遞的誤區。code

編程的道路,由於分享愈來愈寬!對象

參考:
https://segmentfault.com/q/10...
https://segmentfault.com/q/10...blog

相關文章
相關標籤/搜索