javascript基本类型和引用类型

赋值就是把某一个值赋给变量。

我凭什么要把值赋给变量?

变量相当于名字。

拿我举例,如果我没有名字,当别人叫我帮忙的时候,就只能说:

“那个个头不高、颜值爆表、头发很硬、坐在角落的小哥哥,过来帮我一下呗!”

而有名字的情况是:

“小强快来!”

可见变量赋值的意义在于便于使唤。

基本类型的赋值

基本类型的赋值,好比在每个盒子里放东西。

直接赋值

例如,

var a = '手机' console.log(a) // '手机'

相当于,给一个盒子起名为a,并放进去一个字符串‘手机’。

将变量赋值给变量

例如,

var a = '苹果' var b = a a = '' console.log(a) // '' console.log(b) // '苹果'

当var b = a时,相当于:

给一个盒子起名为b,并偷看一下盒子a里面放的什么,然后自己里面放同样的东西。

javascript基本类型和引用类型

当a = ''时,相当于:

盒子a里面原来的东西不要了,改放一个''进去。

但是,这并不会影响盒子b中的值。

因为,在盒子a里面发生变化的时候,盒子b并不关心。

只有将变量a赋值给变量b,即b = a时,

b才会出现偷看行为,进而使自身的值和a的值一样。

可见,赋值就是复制,特点是赋值过后互不影响。

好比我把感冒复制给朋友,我吃完药好了,并不能代表他也好了。

引用类型的赋值

引用类型的赋值,看上去是共享,实际还是复制。

栈和堆

首先,基本类型采用栈存储,一个萝卜一个坑。

前面也说到,基本类型的赋值,就像在每个盒子里放东西,比如,

我在a盒子里放个香蕉、

我在b盒子里放个手机、

我在c盒子里放个老鼠、

我在d盒子里放个房子...

javascript基本类型和引用类型

问题出现了,

之前,我们在盒子里放一些很傻很天真的东西,基本没问题,

但是,盒子里可以放房子吗?

这时候,我们进一步认识一下我们的盒子(栈存储)有什么特点?

盒子按顺序排列

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

每个盒子都不是很大

显然,我们的盒子不足以装下房子。

而且常识告诉你:

房子里倒是能堆很多的盒子,因此房子就是堆存储。

javascript基本类型和引用类型

堆存储就像找了一片空地,然后在上面尽情放盒子(请不要想到《我的世界》)。

特点就是存的多、存的乱。

理解堆和栈的区别,也可以参照公交车,

每个座位,

有序、只能坐一人、大小有限...

好比栈;

其它地方,

能挤下一堆人,很乱...

好比堆。

对象采用的就是堆存储。

什么是引用类型

我们知道,javascript引用类型包括对象。

先随便来一个对象:

var a = {} // 堆存储,相当于建了个房子,名为a

再随便来一个数字:

var b = 10 // 栈存储,相当于选了个盒子,名为b

再随便来一下:

b = a console.log(b) // {}

太随便就容易出问题:

原本b是一个正经盒子,a是一个正经房子,

执行b = a之后,b变成了{},

根据上面说的基本类型的赋值,这是不是在说

盒子b虽然之前只是一个小盒子、

但是偷看了一眼房子a之后、

自己发奋图强变成像房子a一样大的盒子、

并复制了房子a里面的东西?

不是的。

盒子b并没有为了复制房子a里面的东西而变大,

实际上,a其实从头到尾都只是一个盒子、而不是房子,仅管我们看到是a被赋值了一个堆存储的对象。

为什么呢?

因为引用类型只暴露一个地址给我们,

操作引用类型的数据时(比如赋值),我们也只是在操作这个地址、引用、指针...爱叫啥叫啥。

这就好比,你送女朋友戒指,可以直接放到她手里,这是基本类型;

你送女朋友法拉利,并非把法拉利直接放到她手里,而是把车钥匙放到她手里,这就是引用类型;

你送女朋友房子,并非把房子直接交给她(除非你们是蜗牛),而是把房钥匙交给她,这也是引用类型。

从赋值上来进一步认识引用类型:

直接赋值

开始说过,

变量相当于名字。

另一个事实是,

我们只能给盒子起名字,不能给房子起名字,但是我们能拿到房子的钥匙。

这就是为什么说,a其实从头到尾都只是一个盒子。

var b = 10相当于取一个盒子叫b,然后里面放啥啥啥,这没有问题;

由于我们不能给房子起名字,

所以var a = {}肯定不是说:取了一个房子叫a,然后里面放啥啥啥。

其实,和var b = 10的解释一模一样,var a = {}也相当于

取了一个盒子叫a,然后里面放啥啥啥。

只不过是,b盒子里面放很傻很天真的东西,

a盒子里面放很傻很天真的钥匙,这把钥匙对应一个大房子。

引用类型的直接赋值就是把钥匙放到对应盒子里。

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

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