00:00
大家好,我是学习园地的特约讲师高洛峰,上节课咱们学习了一个关键字light,那这节课呢,咱们再学习关键字cost。那这两个有什么区别,我们先看一下。VR我们在声明变量的时候呢,它有几个缺陷,这是我上节课给大家呃标记出来的一个缺陷呢,就是呃,它可以重复声明,然后呢,呃无法限制修改,还有没有快置作用域,那为这个问题和这个问题咱们用light都可以解决,那它还有一个缺陷就是什么?无法限制修改,也就是就是一个变量的作用,那light声明也是一个变量作用,而cost声明相当于常量的作用,又弥补了VR的一个不让它就是限制修改的这样的一个功能,所以呢,在ES6语法里边新增加了light和cost来弥补VR。是这样的一个情况,用两个关键字来弥补,一个关键字VR,这样的话就让我们加好斯克这门语言更友好一些。那咱们在使,那这个什么时候使用VR呢?告诉你以后没有任何时候使用VR对吧,都不用了,那什么时候使用light,那你想象一下这个变量,如果后边需要修改的时候,对吧,我们就。
01:06
使用light,如果后边不让别人去对这个变量值进行修改的时候,我们就用cos,就这样的一个区分,那cos的语法和light语法又有什么样的区别呢?除了一个最最主要的就是一旦声明它就是主只读的,对吧,这个常量值呢就不修改了。这是最主要的一个,它的原因。另外就像我们派的值3.1415926对不对,那个值呢,就是固定用法,从来不用修改,因为修改圆周率就变了,对吧。那有可能世界都改变,所以呢,那值是不要修改的,那就是使用cos的标记就可以了,其他的用法其实呢,跟light都一样,比如说这个命令声声明常例light一样,不可以重复声明,咱们light声明变量的时候也不可以重复声明,对吧,那声明嗯,这个变量也不提升,只有VR提升,Light变量不提升,也就是必须得先声明再使用。对吧?然后cost呢,和light一样,也是有块级作用域的,在if里边负循环那个大框里都是有用的,而VR是不行的,只能在函数里边有用,对吧。
02:07
那我们就看一下这几个作用,我们在这块再新建一个,呃,M文件吧,也叫文件,也叫cost.tm直接就TL,然后SC这块,你看那几个我就不给大家试啊,你自己有空去试试,比如说必须得先声明再使用啊,不能重复声明啊,对吧?在作用句里边有效啊,它都有跟light是一样的,对吧?只不过它跟light的区别就是它声明的值不能改变,你比如说呃,Light的声明能改变我就不用说了,Cost生命一个电量name等于常量,最好是全大写啊,当然大不大写都无所谓啊,加va是虽然是支持大小写的。呃,但是我们习惯一般常能发现,比如说。KY对吧,那我们以后用的时候就啊这样就直接。那件嗯道声明完对吧,你可以任意的使用快计作语,什么都支持,这是一个声明,一个使用简单的用法,当然我在控制台打印的,所以得在控制台里边看,是这样。
03:11
这是它最主要的一个区别,那还有一个和light不一样的,我们light可以干嘛呀,可以先声明对吧,先声明,然后呢,我再赋值。这是light可以做到的,但是cost它属于常量,如果你在声明的时候,声明的时候你不给它。负值,那以后因为它值是不可以改变嘛,后期永远负不上值了。因为没有给这个长料,后期得有赋值的这样的一个功能,比如说这块加上你看。没有给长量等于什么什么的,没有这样的情况,所以呢,你这样是出错的。对吧。那常量只有一种,声明的时候复制,只有声明的时候复制。其他的情况是不允许的,所以呢,这是跟light的另外一点的区别。
04:04
这些。其他的也就是用嗯,Cost和light这两个变量弥补了VR那三个不足,这样的模拟的就是呃两个来弥补一个,那cost是这个用法吗?其实呢,嗯,Cost实际上呢,它并不是什么变量的值不能改变,而是变量直线的内存地址是不能改变的。指向的内存地址是不能改变的,那我们来看一下变量是怎么存的,Light cost这些变量值是怎么存的,我们用一个画图吧。画图功率,你看其实呢,我们内存是分四段的。呃,比如说有代码段,代码段的当然了就存一些,比如说方法啊,什么东西在里边存的对吧,还有一个呃,占内存,你就把它想象成那个像手枪弹夹一样,那对应内存的就是很大很大的一个地方,对吧。分四段啊,然后还有那个静态代码段,就相当于全局的,那咱就不说了,这里边用不上那变量和常量,它都是存在站里边的。
05:07
你比如说咱们像梯子一样。在里边是这样。假如说我这里边给我们声明一个变量这块,Let a等于十,Let b等于20。Cost。C等于30,假如说这三个变量啊,那我们也这块给你标记一下。这款七二。占内存这块你标记一下。堆内存这样的一个情况啊,那我们这三个变量声明它是怎么标记的,在占内存里边,因为占的空间小,但是运行速度快,在这里边存,所以呢,一些小的数据在这里边存,那声明的变量A就是在前边相当有个A。在这相当于生成个A,然后呢,只要是内存,它都有对应的一个是地址的,你比如说这块地址对应的是16进制的0X,呃,000001吧,就假如说是一个16进制的这样的一个地址,然后呢,声明的变量B。
06:10
这块假如是挨着生存的,在里边是四个字角应S0000,假如说这块啊,是16进制嘛,可以用标标记啊,然后C。这块我们画的是0X000008,假如说是这样的一个情况,那。有什么有变量,有地值,里边对应存的就是我们生命变量,那个值用的时候就到这里边,可以通过名称找这个值,也可以通过地址找这个值,通过地址找值,那我们就是指针了,那个意思或者交给引用吧啊十在里边存着。20这里面存的是30。暂时这样的,那现在如果我把这个变量重新赋值。重新变量,如果变量重新赋值,也就是给A等于50改成,那相当于什么呢?相当于把A对应的这里边的值,就把原来这里边的值给替换掉了,用一个红色的吧,把这个值十去掉了,变成了50,所以呢,我们在打印A的时候,它的值就是50。
07:12
值就是50。是这样的作用。而什么呢?而我们的cost。那他不是说变量的这个值不是改动,而是变量指向的内存地址是不想改的,也就是什么呢这个地方。这个地方这个C是cos的C嘛,对不对,是用这个长的生命的这个对应的内存地址,地址对应的这里边的值,这个是改不了的。你是动不了的。他不让改,所以一改就出错。所以用cos标记的相当于这块是一个,你比如说这块类似于只要Co标记的,假设这块是灰色的吧。这个还不太好。还好,标记。嗯。对吧,就类就类似这样,你就记得稀释常量不能改对吧,但是我们在程序里边你看啊,Cost声音字符串也好,对吧,嗯,还有。
08:05
这个也好,这个也好,就是字符串整形大户型这些类型都好,都是在站里边不能改的,那么。谁呢?复合类型。这些都是单类型,复合类型的,就是一个变量里边存多个值的,这叫复合类型,那有的语言里边字符串,这也算是多个字符,比如C语言里边对吧,但是呢,那个加个串不是加,比如说。啊,单值这都算,单值这算里边像数组对象,这属于什么是多值的。那比如说这里边儿我们存一个对象。存一个对象啊,在这里边,假如说我们不用这个。你看啊,咱说cost是用生命的值是不可以改的,但是我现在cost声明一个obj b项等于,我这会来一个,你看name等于。张三,对吧,年龄等于十岁,性别是。性别是来,你看我声明了一个这样的,呃,数独也可以啊。
09:03
那它俩都属于复合类型,那么OB接点rog。打印的时候,你看我打印这个常量,我声明打印,因为我们声明任何类型,函数类型,什么类型我们都可以用cost,只要声明我们加的关键词cost light都可以啊,就看你需不需要去改了,来我们刷新一下。你看那这个对不对,但是呢,你看我现在是可以这么改的,OB接点name,我让它等于。那好。蒙。我们再刷新一下。一下变成R了,当然年龄什么的也都可以去玩,那有的说。不是常量标记的,不能修改吗?你看怎么不能修改,我是obj内,你看我修改了,但是我这么的,我把obj等于另外一个对象,哪怕是一个空对象。来,我们看一下。就不我们出错了,告诉我们常量是不能改的,那这是为什么呢?那我们还要看这个图。如果是复合类型的,因为占用的空间比较大,占里边是不保存复合类型的,像数组和对象,它呢,是在堆里边去保存的,堆里边去保存的,比如说声明了一个对象在堆里边里边呢,因为这里边儿可以有很大的一个空间嘛,对吧。
10:16
在堆里边保存,堆里边保存呢,我们这块。再让他有一个比如说名字。然后它这里边儿也有一个地球0X,比如说20001对吧,然后有个年龄A。就是这里边儿。也有个地址0X20020随便写的,然后这里边得有个性别这个对象,然后他也有个地址0X,嗯,20080就随便写啊,然后我们在这里边存的这个名字是张三这块,年龄是比如说十岁,性别存的是男,是这么存的,那这么存堆里边那程序是直接找找不到的,怎么办呢?会把他在站里边声明一个句柄,我们也叫它引用,也就是在这个位置声明一个什么。
11:07
声明了一个用cost声明了一个obj。用抗的声明呢?就假如说这块咱们说明了。多少就是。Cost声明,Obj等于对象名字等于什么?等于张三?张三,然后年龄是十岁,性别。那你看是这样说明的,那我们前边的这个名称只是一个引用在这块,那它本身也有一个地址,你比如说0X这块0X00012吧,这边写的啊,然后。在这里边声明引用我们会把什么,因为它是复合类型声明的这些东西,这些东西。是在这堆里边声明的,会把堆里边这个首地址。放到这里边来,也就是在这里边纯的。保存的是堆里边的首地址,那就是0X2000几个零幺。
12:07
是这样的一个情况。所以呢,我们用cost声明的这个常量,声明的这个常量这个位置是在这块告诉我们这个是不能改的。这个是不能改的,所以呢,我们在代码里边,你看我们把obj如果付给一个新的对象,那相当于我在堆里边又开辟了一段新的空间,新的空间对吧?然后呢,这个新的空间里边,它有它这块有一个首地址,比如说0X,呃5000001,那意味着想把这个首地址,想把这个首地址对吧,付给这个改变他。因为这一块是不让改的,用Co声明的,这里边纸不让改,这也就是刚才我说的什么。呃,这个常量什么保存的,这个内存地址是不让修改的。你把obj重新赋值是相当于堆里边生明了一个其他对象,把首地址改,他想把这个改掉,他不让对吧。
13:03
常量限制的是这一块,但是呢,为什么说我要用对象点内部可以改呢,这里边儿的你又不是常量对吧。所以呢,这里边的值是可以改的,所以我调用什么。对象点内。是可以把这里边儿是改掉的。这就是原理。要知道它限制的是什么。那数组也是同样的原理,对吧?复合类型都是一样的。所以这点大家要要清楚啊,也就是嗯,对于简单的数据类型,什么字符串啊,整数不行啊,对不对,那值就保存到变量指向内内存地址对吧。但是对于复合类型的数据,咱说的就是这个对象和这个数组对吧?变量指向的内存地址,保存的只是一个指针,咱说保存地址的变量其实就是一个指针,就是一个引用。那图。所以呢,Cost只能保证这个指针是固定的,不让你修改的。他所指向的。这个真正的这个数据结构对吧。
14:01
就不受控制了,你就可以改了。所以呢,将一个对象声明为常量,你要知道对象里边内容是可以改的,而对象的一个引用你不能给换,不能换另外一个对象。同一引用怎么去用啊?所以我们后期像呃用vuee或者react,我们通常导入的时候不想用名修改啊,对吧,导进来的对象什么的都可以用cos的声明对吧,不用艾也行,所以cos用的几率呢也很多。也很多。应该说经常去用,你比如说。咱们在原来的框架里面经常这样。当然这个咱还没学呢,AB的方法对吧,或者是你看原来我们学的呃,上上节课我们学过的什么,比如这里边的呃,Join。对吧,像这样去证明一个等于不是等着嗯。这块通过这个声明等于吧一块IQI对吧,导入什么什么。
15:00
当前目录下什么?我这里边暴露出来的一个方法也好,或者是一个对象也好,你看都这么去声明了,对吧,都是用cos,所以前边在用一些简单的ES语法的时候,你看我也经常cos对吧。因为我知道后边的值,我很少对它进行更改,对吧,因为就用导过来的固定这名称,这名称我是不修改的,那我就告诉他,如果导入这个名称,那你还想从别的包,根据情况从别的包里边导入其他的函数或者方法把它替换掉,那你就不用告诉。就是这样的区别。啊,这就是light cost,要知道这两个区别,它们两个加在一起就可以弥补VR的一些缺陷,那它俩之间的区别用法完全相同。cost和它的唯一的区别,Cost声明的是只读的,不能修改的,其他都一样。好,谢谢大家,这节课我们讲。
我来说两句