在JavaScript中,const
、let
和 var
都可以用来声明变量,但它们在行为和作用域上有显著的区别:
1. 作用域(Scope)
关键词 |
作用域 |
var |
函数作用域。声明的变量在整个函数内可用。 |
let |
块作用域。变量只在花括号 {} 内有效。 |
const |
块作用域。与 let 一样,限定在块内。 |
示例:
function testVar() {
if (true) {
var x = 10; // 函数作用域
}
console.log(x); // 10
}
function testLet() {
if (true) {
let y = 20; // 块作用域
}
console.log(y); // 报错:y is not defined
}
testVar();
testLet();
2. 重新赋值(Reassignment)
关键词 |
是否可重新赋值 |
var |
可以 |
let |
可以 |
const |
不可以(值不能被重新赋值) |
示例:
var a = 1;
a = 2; // 可以
let b = 1;
b = 2; // 可以
const c = 1;
c = 2; // 报错:Assignment to constant variable.
3. 重新声明(Redeclaration)
关键词 |
是否可重新声明 |
var |
可以 |
let |
不可以 |
const |
不可以 |
示例:
var x = 1;
var x = 2; // 可以,没问题
let y = 1;
let y = 2; // 报错:Identifier 'y' has already been declared
const z = 1;
const z = 2; // 报错:Identifier 'z' has already been declared
4. 变量提升(Hoisting)
关键词 |
是否存在变量提升 |
var |
是,变量会提升,但值为 undefined
|
let |
是,但在声明前使用会报错(暂时性死区) |
const |
是,但在声明前使用会报错(暂时性死区) |
示例:
console.log(a); // undefined
var a = 5;
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 10;
console.log(c); // 报错:Cannot access 'c' before initialization
const c = 15;
5. const
特别之处
-
const
声明的变量不能重新赋值,但如果是对象或数组,其内部的内容是可以更改的。
示例:
const obj = { name: "Alice" };
obj.name = "Bob"; // 可以修改对象属性
const arr = [1, 2, 3];
arr.push(4); // 可以修改数组内容
obj = {}; // 报错:Assignment to constant variable.
总结
-
var
:适用于函数作用域的变量,但容易引发作用域混乱和意外错误,现代开发中不推荐使用。
-
let
:块级作用域变量,推荐使用。
-
const
:块级作用域,声明后不能重新赋值,适用于不可变的变量。