目录
在 JavaScript 中,const、let 和 var 都用于声明变量,但它们在 作用域、提升(hoisting)、重复声明 和 可变性 等方面有显著区别
这三个关键字隔一段时间就会忘记区别,需要把这三个的区别记录一下
在 JavaScript 中,const、let 和 var 都用于声明变量,但它们在 作用域、提升(hoisting)、重复声明 和 可变性 等方面有显著区别
1. 作用域(Scope)
| 关键字 | 作用域类型 | 示例 |
|---|---|---|
var | 函数作用域(Function Scope) | 在整个函数内有效 |
let | 块级作用域(Block Scope) | 仅在 {} 内有效 |
const | 块级作用域(Block Scope) | 仅在 {} 内有效 |
例如:
function scopeExample() {
if (true) {
var varVar = "var"; // 函数作用域
let letVar = "let"; // 块级作用域
const constVar = "const"; // 块级作用域
}
console.log(varVar); // "var"(可以访问)
console.log(letVar); // 报错:letVar is not defined
console.log(constVar); // 报错:constVar is not defined
}
scopeExample();
2. 变量提升(Hoisting)
| 关键字 | 是否提升 | 初始化值 |
|---|---|---|
var | 是(声明提升,赋值不提升) | undefined |
let | 是(但存在 暂时性死区) | 未初始化 |
const | 是(但存在 暂时性死区) | 必须初始化 |
console.log(a); // undefined(var 提升)
var a = 10;
console.log(b); // 报错:Cannot access 'b' before initialization(let 提升但未初始化)
let b = 20;
console.log(c); // 报错:Cannot access 'c' before initialization(const 提升但未初始化)
const c = 30;
3. 重复声明
| 关键字 | 是否允许重复声明 |
|---|---|
var | 允许(会覆盖) |
let | 不允许(报错) |
const | 不允许(报错) |
var x = 10;
var x = 20; // 允许
let y = 10;
let y = 20; // 报错:Identifier 'y' has already been declared
const z = 10;
const z = 20; // 报错:Identifier 'z' has already been declared
4. 可变性(Reassignment)
| 关键字 | 是否可重新赋值 | 是否可变(对象/数组) |
|---|---|---|
var | 可以 | 可以修改 |
let | 可以 | 可以修改 |
const | 不可以(但对象/数组内容可修改) | 可以修改 |
var a = 10;
a = 20; // 允许
let b = 10;
b = 20; // 允许
const c = 10;
c = 20; // 报错:Assignment to constant variable
// 但对象/数组可以修改内容
const obj = { name: "Alice" };
obj.name = "Bob"; // 允许
obj = {}; // 报错(不能重新赋值)
5. 最佳实践
| 关键字 | 适用场景 |
|---|---|
const | 默认使用(推荐),适用于常量、对象、数组 |
let | 需要重新赋值时(如循环变量) |
var | 避免使用(旧代码或特殊需求) |
// 默认用 const
const PI = 3.14;
const user = { name: "Alice" };
// 需要重新赋值时用 let
let count = 0;
count++;
// 避免 var
var oldVar = "avoid"; // ❌ 不推荐
总结
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 提升 | 是(初始 undefined) | 是(暂时性死区) | 是(暂时性死区) |
| 重复声明 | 允许 | 不允许 | 不允许 |
| 重新赋值 | 允许 | 允许 | 不允许(但对象/数组内容可变) |
| 默认值 | undefined | 未初始化 | 必须初始化 |
现代 JavaScript 开发建议:
- 优先使用
const(默认选择)。 - 需要重新赋值时用
let。 - 避免使用
var(除非维护旧代码)。
⚠️以上内容部分源于大模型,如有雷同,联系修改

被折叠的 条评论
为什么被折叠?



