#9varletconst 的区别是什么?

预计阅读时间: 3 分钟

var 关键字

在ES6之前,JavaScript中只有var关键字用来声明变量,但是var声明的变量存在一些问题。

  1. 当 var 变量在函数外部声明时,作用域是全局的。这意味着在函数体外用var声明的任何变量都可以在整个窗口中使用。
  2. var 变量可以被重复声明和修改,这可能会导致变量被意外覆盖。
var x = 10;
var x = 20; // No error
x = 30; // No error
  1. var 变量提升。在函数内部,无论变量声明在哪里,都会被视为在函数的顶部声明。
console.log(x); // undefined
var x = 10;

// 实际上等价于
var x;
console.log(x); // undefined
x = 10;

由于这些问题,ES6引入了letconst关键字来解决var的一些问题。

let关键字

let现在是我们在JavaScript中声明变量的首选方式,它是对var的改进,同时还是解决了var存在的一些问题。

  1. let声明的变量具有块级作用域,只在声明的块内部有效。
{
    let x = 10;
    console.log(x); // 10
}

console.log(x); // ReferenceError: x is not defined
  1. let不允许重复声明同一个变量。
let x = 10;
let x = 20; // SyntaxError: Identifier 'x' has already been declared
  1. let不会变量提升。
console.log(x); // ReferenceError: x is not defined
let x = 10;

const关键字

const 声明的变量保持恒定值。const 声明与 let 声明有一些相似之处。

  1. const声明的变量也具有块级作用域。
{
    const x = 10;
    console.log(x); // 10
}

console.log(x); // ReferenceError: x is not defined
  1. const声明的变量必须进行初始化,且不能再次赋值。
const x = 10;
x = 20; // TypeError: Assignment to constant variable
  1. const声明的变量不会变量提升。
console.log(x); // ReferenceError: x is not defined
const x = 10;

总结

  • var声明的变量存在一些问题,如变量提升、全局作用域等。
  • letvar的改进,具有块级作用域、不会变量提升、不允许重复声明等特性。
  • const声明的变量是常量,不允许再次赋值,其他特性与let相似, 它不改变变量的存储方式,只是增加了赋值限制,所以对于复杂类型的变量,只是限制了变量的引用地址不变,而不是引用的对象不变。

以下是const对于复杂类型的限制:

const obj = { name: 'Alice' };
obj.name = 'Bob'; // No error

obj = { name: 'Bob' }; // TypeError: Assignment to constant variable

const arr = [1, 2, 3];
arr.push(4); // No error

arr = [4, 5, 6]; // TypeError: Assignment to constant variable