原由是在逛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