javascript基本类型和引用类型 (2)

javascript基本类型和引用类型

为什么只给盒子起名字?

代码中,会出现很频繁的变量赋值行为,

为了保证运行速度,这些行为被优先安排在一批有序的盒子中,偷看、复制、再偷看...

可以说,我们大部分时间在玩盒子。

可想而知,如果换成玩房子的话,要费多大的力气。

但是呢,房子在我们的程序中也有着不可或缺的作用,

这时候它就暴露出一个可以找到它的钥匙,相当于它的联系方式,

然后放进相应的盒子里,并说:

当你需要我的时候,我会在你身边。

正是因为这样,我们既便于使唤房子,又便于操作房子里的东西。

将变量赋值给变量 var obj = {name: '小强'} var obj2 = obj console.log(obj2) // {name: '小强'}

首先,var obj = {name: '小强'}是引用类型的直接赋值,

相当于找到一个盒子名obj,把{name: '小强'}这个房子的钥匙放进盒子obj里面。

而obj2 = obj可以说和基本类型的变量赋值给变量一样,

盒子obj2偷看一眼盒子obj中放的东西,复制一下,自己里面放同样的东西。

javascript基本类型和引用类型

喜出望外的是,竟然是一把对应某个房间的钥匙!

这时,obj2就和obj一样,都能访问这把钥匙对应的房间了。

所以引用对象的赋值都是操作钥匙。

引用类型赋值面试题

例一、

var a = {n: 1} var b = a a.x = a = {n: 2} console.log(a.x) // undefined console.log(b.x) // {n: 2}

逐句翻译吧:

var a = {n: 1}

取一个盒子名a,建一个房子,钥匙放到盒子a里面;

房子里有个盒子n,放着1。

javascript基本类型和引用类型

var b = a

取一个盒子名b,盒子b偷看一下盒子a,哇哦,一把钥匙,

盒子b里面也有了这把钥匙,也能去访问这个房间了。

javascript基本类型和引用类型

a.x = a = {n: 2}

变量赋值是从右向左的

对象用.赋值的时候,就是操作对象的某个属性,如果没有该属性就添加一个

我们通过盒子a中的钥匙,来到了这把钥匙对应的房间,

然后,我们在这个房间取一个盒子名x,并企图在里面放东西。

执行到a.x = a的时候,我们还以为:

是把盒子a里面的钥匙,放进我们所处房间的盒子X里面吗?

差点就是了,但是后面又有=赋值。

根据变量赋值从右向左,

我们暂时先不在这个房间里的盒子x放东西,而是优先执行a = {n: 2},

这条语句显然是引用类型的直接赋值,

即建了一个是{n: 2}这种样子的房子,然后把钥匙放到盒子a里面。

在栈和堆里面我们提到过:

每个盒子只能存放一件物品。

因此,盒子a首先会抛掉之前的钥匙,然后存下这把新的钥匙。

刚才我们拿着盒子a之前的钥匙,进到对应的房间,企图在房间的盒子x里放东西;

然后,发现后面还有赋值行为,所以优先执行后面的赋值行为。

但是,当时我们只是暂停,而不是放弃。

换句话说,是不忘初心,有始有终。

当初我们进的哪个房子,想在哪个盒子放东西,

现在我们就回到哪个房子,然后给哪个盒子放东西,

从a.x = a可以看出,我们在盒子x里放的是盒子a的钥匙,

在这个例子中,盒子a中现在的钥匙就是能打开{n: 2}这间房子的钥匙。

虽然说,

变量赋值是从右向左的。

但是,代码执行是从左向右的。

无论后面发生了多大变化,a.x都是最先执行的,它的作用就是:

通过钥匙来到一个房间,取盒子x,然后等着在里面放东西。

后面的代码,只能影响这个盒子里放什么东西。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyspjp.html