常见区别
- var与let声明的是变量
- const声明的是只读常量
- var声明的变量不存在块级作用域
- let声明的变量存在块级作用域,即有暂时性死区,它所声明的变量就绑定了这个代码块,不再受外部的影响,只在代码块内有效
- var声明的变量存在变量提升
- let声明的变量不存在变量提升
- const声明的变量也不存在变量提升
- var定义变量可以先使用再去声明
- let与const定义的变量(常量)只能先声明在使用
- le不允许在相同作用域内重复声明同一个变量,const同样也不允许,var允许
- const如果声明了一个复合类型的常量,则它存的是一个地址,不允许改变的是这个引用地址,对象本身是可变的
原理剖析
变量与内存之间的关系,主要有三部分组成
- 变量名
- 内存地址
- 内存空间
步骤
- JS引擎在读取变量时先找到变量绑定的地址,通过地址找到内存空间,再去读取内存空间的内容。
- 在给一个变量进行重新赋值时,并非是把原有的内存空间的内容覆盖,而是会重新开辟一块新的内存空间,让这个变量名转而指向这个新的内存空间,原有的空间会在合适的时候被垃圾回收
- const定义一个常量之后,变量名和内存地址之间存在一个不可变的绑定关系,阻隔变量地址被改变