ES5 只有两种声明变量的方法:var命令和function命令。
ES6 除了添加let和const命令,后面章节还会提到另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。不过下面我们具体先只介绍 let 和 const 命令。
1、let、const 与 var 的区别
(1)块级作用域: 块作用域由 { } 包裹着,let 和 const 具有块级作用域,var 不存在块级作用域。let 和 const 声明的变量只在它所在的代码块有效,即块级作用域可以有效解决 ES5 中的两个问题:
- 内层变量可能覆盖外层变量
- 用来计数的循环变量泄露为全局变量
(2)暂时性死区: 在代码块内,使用 let、const 命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用 var 声明的变量不存在暂时性死区。
(3)变量提升: var 存在变量提升,即变量可以在声明之前使用,值为undefined。而 let、const 不存在变量提升,即它们声明的变量只能在声明之后使用,否则会报错。
(4)重复声明: var 可以重复声明变量,后声明的同名变量会覆盖之前声明的变量。const、let 不允许在相同作用域内,重复声明同一个变量。
(5)添加为全局对象的属性: 浏览器的全局对象是 window,Node 的全局对象是 global。var 声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是 let 和 const 不会。
2、const 与 var、let的区别
(1)初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而 const 声明变量必须设置初始值。
(2)指针指向: var 和 let 创建的变量是可以更改指针指向。但 const 声明的变量是不允许改变指针的指向。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。- 对于基本类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址(栈区),因此等同于常量。
- 但对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,
const只能保证这个指针是固定的(即总是指向一个固定的堆区内存地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
3、总结
| 区别 | var | let | const |
|---|---|---|---|
| 是否有块级作用域 | × | ✔️ | ✔️ |
| 是否存在变量提升 | ✔️ | × | × |
| 是否添加全局属性 | ✔️ | × | × |
| 能否重复声明变量 | ✔️ | × | × |
| 是否存在暂时性死区 | × | ✔️ | ✔️ |
| 是否必须设置初始值 | × | × | ✔️ |
| 能否改变指针指向 | ✔️ | ✔️ | × |