复杂数值类型对函数传参问题

50 阅读1分钟

在网上看到了一个题目,如下

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])前,形参堆地址和变量堆地址是相同的,对形参修改,等同于对被引用变量修改,操作的是同一对象。

延伸一些堆和栈的基础知识: 简单数据类型的值直接存放在栈空间内 在这里插入图片描述 复杂数据类型的地址存在在栈空间内,值存在于堆,通过栈内地址找到值

在这里插入图片描述