ES6
var、let、const
var
- 作用域:函数作用域,函数中声明为局部变量,函数外声明为全局变量,在全局作用域下会成为 window 的属性
- 变量提升:存在变量提升,变量可以在声明之前调用,值为
undefined - 重复声明:允许在同一作用域中重复声明变量
- 可修改性:可以修改变量的值
let
- 作用域:块级作用域,只在
let命令所在的代码块内有效 - 变量提升:不存在变量提升,必须先声明后使用
- 暂时性死区:只要块级作用域内存在
let命令,该变量就绑定这个区域,不再受外部影响 - 重复声明:不允许在相同作用域中重复声明
- 可修改性:可以修改变量的值
const
- 作用域:块级作用域,只在
const命令所在的代码块内有效 - 变量提升:不存在变量提升,必须先声明后使用
- 暂时性死区:同
let,存在暂时性死区 - 必须初始化:声明时必须立即初始化
- 重复声明:不允许在相同作用域中重复声明
- 可修改性:
- 声明一个只读的常量,一旦声明,常量的值就不能改变
- 注意:
const实际保证的是变量指向的内存地址不可改动- 对于基本类型(Number、String 等):值保存在变量指向的内存地址中,等同于常量
- 对于引用类型(Object、Array 等):变量指向的内存地址保存的是指针,
const只能保证指针固定,不能保证数据结构不变
三者区别总结
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 变量提升 | 存在 | 不可在声明前访问 | 不可在声明前访问 |
| 暂时性死区 | 不存在 | 存在 | 存在 |
| 重复声明 | 允许 | 不允许 | 不允许 |
| 可修改性 | 可修改 | 可修改 | 不可修改(引用类型可修改内部属性) |
| 初始化要求 | 可选 | 可选 | 必须初始化 |