在网上看到了一个题目,如下
var x = [12,23];
function fn(y){
y[0] = 100;
y = [100];
y[1] = 200;
console.log("y=",y);
}
fn(x);
console.log("x=",x);
这么单看下来我脑里秒出答案 y=[100,200] x=[12,23] 这么想那可就入圈套了。 正确答案:
y=[100,200] x=[100,23]
这时我就不明白了,形参不是和外面的变量分开独立的吗,怎么在函数里改变形参的值会影响到被引用的变量,老规矩问同事上网查了一下恍然大悟。
简单数据类型:给值
(此时这个形参获得值相当于在栈内push了一个完全跟被引用变量独立的栈内存)
复杂数据类型:给地址
(此时这个形参获得的地址与被引用变量相同,指向堆内数据也相同)
对象,数组属于复杂数据类型,被形参引用的时候,传的是地址,在没有赋予新的地址之前(例子中的y = [100])前,形参堆地址和变量堆地址是相同的,对形参修改,等同于对被引用变量修改,操作的是同一对象。
延伸一些堆和栈的基础知识:
简单数据类型的值直接存放在栈空间内
复杂数据类型的地址存在在栈空间内,值存在于堆,通过栈内地址找到值