var、let、const 有什么区别?什么是变量提升和暂时性死区?
var vs let vs const
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 变量提升 | ✅ 提升且初始化为 undefined | ✅ 提升但不初始化 | ✅ 提升但不初始化 |
| 重复声明 | 允许 | 不允许 | 不允许 |
| 重新赋值 | 允许 | 允许 | 不允许 |
| 挂载到 window | ✅ | ❌ | ❌ |
变量提升(Hoisting)
console.log(a) // undefined(已提升,已初始化)
var a = 1
console.log(b) // ReferenceError(已提升,但未初始化)
let b = 2var 声明会在编译阶段被提升到作用域顶部并初始化为 undefined。
暂时性死区(TDZ)
let / const 声明的变量虽然也会提升,但在到达声明语句之前处于暂时性死区,访问会抛出 ReferenceError。
{
// TDZ 开始
console.log(x) // ReferenceError
let x = 10 // TDZ 结束
}const 必须在声明时初始化:
const a // SyntaxError
const b = 1 // ✅
b = 2 // TypeError注意:
const不可重新赋值,但对象/数组的内容可以修改:const arr = [1, 2] arr.push(3) // ✅ 允许修改内容 arr = [4, 5] // ❌ 不可重新赋值
最佳实践
- 默认用
const,需要重新赋值时用let,不再使用var