这三个关键字隔一段时间就会忘记区别,需要把这三个的区别记录一下
在 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 definedconsole.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 declaredconst 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
(除非维护旧代码)。
⚠️以上内容部分源于大模型,如有雷同,联系修改