说一说var、let、const之间的区别?

2024-07-22 20:42:41 144
在JavaScript中,`var`、`let`和`const`是用于声明变量的关键字,它们之间有一些重要的区别,这些区别主要体现在变量的作用域、提升机制以及是否可以重新赋值等方面。

1. 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

2. 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

3. 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.

总结

  1. 作用域

    • var:函数作用域或全局作用域
    • let:块级作用域
    • const:块级作用域
  2. 提升

    • var:变量提升并初始化为undefined
    • let:变量提升但在声明前不可访问(TDZ)
    • const:变量提升但在声明前不可访问(TDZ)
  3. 重新赋值

    • var:可以重新赋值
    • let:可以重新赋值
    • const:不能重新赋值,但对象属性可以修改