今天说一下,let、const、var还有数组的解构赋值,不得不说上班偷偷干自己的事情还是挺爽的。let、const、var这三个都可以用来声明变量,但是let和const是es6新出的玩意,而var是之前已经都有的已经存在的东西。关于var我们就不多说了,反正平常也是经常用,就是声明个变量啥的,重点还是要讲一下let和const。至于解构赋值,就是数组按照一定的模式从数组和对象中提取出来值然后对变量赋值,其实就是找规律看眼缘。
首先我们说下块级作用域,在es5呢只存在全局作用域和函数作用域,而es6中新加了个块级作用域,原因呢就是因为原有的内容存在着不便(这句好像是废话);首先是原来的那些个作用域会因为这什么变量提前(就是你还没有声明就已经调用)而导致数据获取的错误,其次就是因为循环导致的全局变量泄漏(这个一些在for循环里做click操作什么的都知道)。所以我们引入块级作用域,啥叫块级作用域呢,可以理解为任意两个大括号{}之间都可以算作块级作用域或者let和const声明变量的地方也可以算作块级作用域。
let呢,作用跟var类似,声明变量,但是let声明的变量只在let命令所在的代码块里面有效(let是老大在这块),在这个代码块之外就不会被认识(类似于出了这个门就六亲不认),但是var不同,函数作用域可以调用全局作用域声明的变量,也可以调用自己函数作用域的变量,并且采取相同变量名的就近原则,你要是这么用let,那就是报错。而且在let的代码块里,let和var不能声明同一个变量不然还是报错,而且你不能在未声明之前调用这样也会报错(这点类似于function,叫什么暂时性死区,这话跟function那个不搭),反正意思就是有let的地方,let声明的变量就是小公主,人是最大的,最好的,必须要不一样,必须要让人排前面。
const呢,跟let差不多,但是它声明一个只读变量,而且你声明的时候就得进行初始化,不然就给你报错。当然const声明的变量呢简单数据就是内存中存储变量值,复杂的数据呢内存中存的是地址,这也就造成了const声明的简单数据不可改变,而复杂的数据你还可以往里面扔点数据属性啥的,毕竟只要内存中的地址不变,你随便搞。其他的大致跟let命令差不多。
根据let、const和var,还有这些个作用域的划分,大致以后window(浏览器端)就不能当全局对象使了,毕竟你搞个let块里面的命令window也读不到,但是好像global(node端)要当全局对象使了,不过这些都是看大佬的文章说的,至于是不是那样我就不知道了。
接下来说解构赋值,数组的结构赋值就是根据对应位置为对应变量赋值,如果对应位置取不到值那么就赋值为undefined;对象的解构赋值就是根据对应的key提取value值赋给对应变量值,取不到对应的值就赋给undefined;函数的解构赋值就是按照参数对应数组或者对象的解构赋值综合起来进行的;解构赋值还可以给它赋默认值(类似于初始化),而且还可以用嵌套赋值(说白了就是取对象的某个属性)。至于像字符串的解构赋值就是将字符串转为数组取里面对应位置的值或者属性,而number和boolean则是转为对象再去按照对象解构赋值方法取搞,null和undefined无法转为对象和数组所以你要是瞎搞就报错。还有就是小心圆括号造成的问题,声明的变量 函数的参数和赋值语句只要和值的类型不对应都会出错,所以一定要注意!!!!