JavaScript高级基础 —— 引用变量与对象的关系

今天看了尚硅谷javascript高级部分的视频,收获颇大,尤其是这个视频

https://www.bilibili.com/video/BV1p4411u7TT?p=145

老师讲解得非常好,在此整理一下,并附上自己的理解

2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据

光看文字是看不懂的,我们来看一个例子

var a = { name:"Ankry" };
var b = a;
b.age = 12;
console.log(a.age);

答案很明显,是12。刚开始我不懂,为什么明明是把a赋值给b,修改b,关a什么事?
后来弄清楚后,只需要一个图就搞定了

在栈空间里,存储的是变量名。 在堆空间里,存储的是对象本身。

首先在第一步, 栈空间的a指向堆空间的对象{ name = “Ankry” }

var a = { name:"Ankry" };

第二步,把 a 的内容赋值给b,a的内容是地址值,所以 b = a 的地址值,指向同一个对象

var b = a;

第三步,通过变量 b 修改对象内部数据,因为是指向同一个变量,所以 a.age=12

b.age = 12;

在这里插入图片描述

同样如果创建一个函数,也是如此。
这里 obj 是形参, a 是实参,相当于 obj = a;
a 、b、obj 指向同一个对象

var a = { name:"Ankry" };
var b = a;
b.age = 12;
console.log(a.age);

*******
function fn1 (obj){
obj.name = "Brish"
}

fn1(a)
console.log(b.name); //Brish

两个引用变量指向同一个对象,其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象。

var a = { age:14 };
var b = a;
a = { name:"Brish" , age:12 };
b.age = 15;
console.log(a.age, b.age, a.name);  

a.age = 12 ;
b.age = 15 ;
a.name = Brish

为什么会这样呢?
在这里插入图片描述

刚开始 a 和 b 都指向同一个对象,但是 a 又新建了一个对象,指向了新对象

a = { name:"Brish" , age:12 };

于是 b.age =15 ; 而此时 a 不变, a = 12;
此时再用另一个小例子加深一下印象

function fn2( obj ){
	obj = { age: 16 };
}
fn2(a);
console.log(a.age);  // 12

你会很迷惑,为什么是12?
看一幅图,你就会明白
在这里插入图片描述
从这里我们知道,实参传递给形参,相当于 obj = a ;

fn2(a);

a 的内容赋值给 obj ,obj 与 a 同时指向 age:12;
然后函数 fn2 里,相当于给 obj 新创建一个对象,但是并不影响 a 指向的对象
所以最后 a.age = 12 ;

function fn2( obj ){
	obj = { age: 16 };
}

函数内部的局部变量会被释放
{ age:16 } 最后会变成垃圾对象

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值