赋值就是把某一个值赋给变量。
我凭什么要把值赋给变量?变量相当于名字。
拿我举例,如果我没有名字,当别人叫我帮忙的时候,就只能说:
“那个个头不高、颜值爆表、头发很硬、坐在角落的小哥哥,过来帮我一下呗!”
而有名字的情况是:
“小强快来!”
可见变量赋值的意义在于便于使唤。
基本类型的赋值基本类型的赋值,好比在每个盒子里放东西。
直接赋值例如,
var a = '手机' console.log(a) // '手机'相当于,给一个盒子起名为a,并放进去一个字符串‘手机’。
将变量赋值给变量例如,
var a = '苹果' var b = a a = '' console.log(a) // '' console.log(b) // '苹果'当var b = a时,相当于:
给一个盒子起名为b,并偷看一下盒子a里面放的什么,然后自己里面放同样的东西。
当a = ''时,相当于:
盒子a里面原来的东西不要了,改放一个''进去。
但是,这并不会影响盒子b中的值。
因为,在盒子a里面发生变化的时候,盒子b并不关心。
只有将变量a赋值给变量b,即b = a时,
b才会出现偷看行为,进而使自身的值和a的值一样。
可见,赋值就是复制,特点是赋值过后互不影响。
好比我把感冒复制给朋友,我吃完药好了,并不能代表他也好了。
引用类型的赋值引用类型的赋值,看上去是共享,实际还是复制。
栈和堆首先,基本类型采用栈存储,一个萝卜一个坑。
前面也说到,基本类型的赋值,就像在每个盒子里放东西,比如,
我在a盒子里放个香蕉、
我在b盒子里放个手机、
我在c盒子里放个老鼠、
我在d盒子里放个房子...
问题出现了,
之前,我们在盒子里放一些很傻很天真的东西,基本没问题,
但是,盒子里可以放房子吗?
这时候,我们进一步认识一下我们的盒子(栈存储)有什么特点?
盒子按顺序排列
每个盒子只能存放一件物品
每个盒子都不是很大
显然,我们的盒子不足以装下房子。
而且常识告诉你:
房子里倒是能堆很多的盒子,因此房子就是堆存储。
堆存储就像找了一片空地,然后在上面尽情放盒子(请不要想到《我的世界》)。
特点就是存的多、存的乱。
理解堆和栈的区别,也可以参照公交车,
每个座位,
有序、只能坐一人、大小有限...
好比栈;
其它地方,
能挤下一堆人,很乱...
好比堆。
对象采用的就是堆存储。
什么是引用类型我们知道,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盒子里面放很傻很天真的钥匙,这把钥匙对应一个大房子。
引用类型的直接赋值就是把钥匙放到对应盒子里。