今天在学习过程中发现了一个比较容易出错的知识:
代码如下:
var a ={age:12};
function fun(obj){
obj.age=14;
}
fun(a);
console.log(a.age);
第一段代码的运行结果是输出:14;而第二段代码运行的结果是输出:12。
var a ={age:12};
function fun(obj){
obj = {age:14};
}
fun(a);
console.log(a.age);
解释如下:
两段代码中我们都创建了一个a数组,由于数组是对象,所以会将数组内容保存在堆内存中,而栈内存保存的是a数组的一个地址值。
在第一段代码中,当我们使用函数fun时,将a作为实参传递给形参obj,此时执行obj.age=14就是根据a的地址值找到堆内存中的内容并修改age为14,此时a数组被修改,输出结果为14.
而在第二段代码中,我们使用函数fun时,也是将a作为实参传递进形参obj,但是执行的语句是obj = {age:14},此时相当于给obj对象重新创建一个数组,在堆内存中obj保存的值是堆内存中新对象的地址值。我们可以为切断了obj跟a的联系,此时a.age并没有被修改,仍然是12.
以下为第二段代码运行时的过程解析:
如果有错误的地方,评论区指正谢谢!