var
var
声明的变量具有函数作用域或全局作用域,而没有块级作用域。var
声明的变量会提升到其作用域的顶部,这意味着变量可以在声明之前使用(但值为undefined
)。var
声明的变量可以重新赋值。function example() {
console.log(x); // 输出: undefined
var x = 10;
console.log(x); // 输出: 10
}
example();
if (true) {
var y = 20;
}
console.log(y); // 输出: 20
let
let
声明的变量具有块级作用域,即在花括号{}
内部的变量仅在该块内有效。let
声明的变量也会提升,但在变量声明之前无法访问(暂时性死区,TDZ)。let
声明的变量可以重新赋值。function example() {
// console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
console.log(x); // 输出: 10
}
example();
if (true) {
let y = 20;
console.log(y); // 输出: 20
}
// console.log(y); // ReferenceError: y is not defined
const
const
声明的变量也具有块级作用域。const
声明的变量与let
一样,会提升但在声明前不可访问(暂时性死区)。const
声明的变量必须在声明时初始化,并且不能重新赋值。但对于对象类型的数据,const
保证的是对象引用不变,而不是对象本身不变。function example() {
// console.log(x); // ReferenceError: Cannot access 'x' before initialization
const x = 10;
console.log(x); // 输出: 10
// x = 20; // TypeError: Assignment to constant variable.
}
example();
if (true) {
const y = 20;
console.log(y); // 输出: 20
}
// console.log(y); // ReferenceError: y is not defined
const obj = { a: 1 };
obj.a = 2; // 允许修改对象属性
console.log(obj.a); // 输出: 2
// obj = { a: 3 }; // TypeError: Assignment to constant variable.
作用域:
var
:函数作用域或全局作用域let
:块级作用域const
:块级作用域提升:
var
:变量提升并初始化为undefined
let
:变量提升但在声明前不可访问(TDZ)const
:变量提升但在声明前不可访问(TDZ)重新赋值:
var
:可以重新赋值let
:可以重新赋值const
:不能重新赋值,但对象属性可以修改