首先总结下它们之间的特性:
let和const:let和const声明的变量不存在变量提升。
(1) 如果在一个作用域下,未声明变量却要去用它,先会去上级作用域查找,有则用上级的。如果没有定义,则会报错。
(2) 如果本作用域有定义,但是声明在引用之后,也会报错。这段时期,在语法上称之为’暂时性死区‘
var:var存在变量提升,如果声明的方式不对,那么一不留神就给你提升成全局变量了。
ES6声明变量的6种方式:var 、 function (←ES5开始支持) 、 let 、const 、 import命令 、 和class命令。
关于他们的关系,我将以故事的形式描述,方便未理解的同学能有个更好的理解方式:
在最开始的前端界,可以说是一个没有特色的世界,大家该怎样就怎样,就这样发展着。直到有一天,有个人倒腾出来一个东西,它可以让我们动态的去改变页面上的一些东西,不管这些东西是一开始就写好了的,还是没有写好的。东西有了,还得有个名字吧?我们暂且将这个东西称之为Javascript。于是乎,"Javascript"这个东西就在前端界流传开来了,为啥?因为它实在是太香了啊!
比如:在Javascript,我忘了声明一个变量,没关系,你尽管写,没有的我自动帮你声明就是。再比如,我忘了是否声明了某个变量,也没关系,你尽管写,我用你最新写的这个 !比如我要对比某些东西是否相同,比如数字1是否等于字符串1,我不管他们是数字还是字符串,只要是1相等就行了,没关系,它还真能实现你这个要求!这就是Javascript!一位很“智能的工具”。
不过随着时间的推移,越来越多的人加入到了这一行。你也知道,人,是一种很复杂的生物,每个人都有自己的个性和喜好。在这些人中,有一种是来自写其他程序过来的人,不管他是转行,还是兴趣还是被迫的,总之,反正是来了。他们来了过后,发现这“Javascript这工具”很是反他们的思想,
比如:我没声明的变量,为啥能用,你不应该提示我吗?让我自己选择是新建还是不新建。再比如,数字1跟字符串1类型都不同,你怎么能觉得是相等呢?总之,Javascript的“智能思想”在他们看来,都是不对的,因为程序一旦拥有了自己的“思想”,就不受控制了,这,是不能忍的!!!!
随着这些“高手”到来,前端界也发生了翻天覆地的变化,让前端足以抗衡后端,当前端变得很重要的时候,就不得允许“Javascript”私自做未经允许的事,比如,变量提升,重复定义变量你还不提示我,私自转换类型来判断等行为。又因为前面提到的,Javascript实在太流行了,重新定义原来已经存在的行为,带来的影响,足以毁灭整个前端界。与之相反是,保留原来的,另外新增行为视乎是个上上上策!于是,就多出了let 和const两个定义变量的关键字。这次,吸取了var的教训,这两个变量不可提升,不可重复声明,还有自己的专属作用域。为了更全面一些,规定let用于可变变量的声明;const用于不可变变量的声明,不管是对象还是数组,只要是你们交到我这里的信息(内存地址),都不可变。至于你们内部怎么变,我不管,我只保证通过我,找到的,一定是你们老家(内存地址)!