var 、 let 和 和 const 区别及实现原理
区别:
- var和let用以变量声明常量,const用于声明只读常量;
- var声明的变量,不存在快级作用域,在全局范围内都有效,let和const声明的,只在它所在的代码块内有效;
- let和const不想var存在变量提升现象,所以var定义的变量可以先使用后声明,let和const只能先声明后使用;
- let声明的变量存在暂时性死区,即只要块级作用域中存在let,那么它声明的变量就绑定了这个区域,不再受外部的影响;
- let不允许在相同作用域内声明同一个变量;
- const在声明变量时必须初始化赋值,一旦声明,其声明的值就不允许改变,更不允许重复声明,如const声明了一个复合类型的常量,其存储的是一个引用地址,不允许改变的是这个地址,而对象本事是可变的;
变量与内存之间的关系,主要由三个部分组成:
- 变量名
- 内存地址
- 内存空间
JS 引擎在读取变量时,先找到变量绑定的内存地址,然后找到地址所指向的内存空间,最后读取其中的内容。当变量改变时,JS 引擎不会用新值覆盖之前旧值的内存空间(虽然从写代码的角度来看,确实像是被覆盖掉了),而是重新分配一个新的内存空间来存储新值,并将新的内存地址与变量进行绑定,JS 引擎会在合适的时机进行 GC,回收旧的内存空间。const 定义变量(常量)后,变量名与内存地址之间建立了一种不可变的绑定关系,阻隔变量地址被改变,当 const 定义的变量进行重新赋值时,根据前面的论述,JS 引擎会尝试重新分配新的内存空间,所以会被拒绝,便会抛出异常。