#9var
、let
和const
的区别是什么?
预计阅读时间: 3 分钟
var
关键字
在ES6之前,JavaScript中只有var
关键字用来声明变量,但是var
声明的变量存在一些问题。
- 当 var 变量在函数外部声明时,作用域是全局的。这意味着在函数体外用
var
声明的任何变量都可以在整个窗口中使用。
- var 变量可以被重复声明和修改,这可能会导致变量被意外覆盖。
var x = 10;
var x = 20; // No error
x = 30; // No error
- var 变量提升。在函数内部,无论变量声明在哪里,都会被视为在函数的顶部声明。
console.log(x); // undefined
var x = 10;
// 实际上等价于
var x;
console.log(x); // undefined
x = 10;
由于这些问题,ES6引入了let
和const
关键字来解决var
的一些问题。
let
关键字
let
现在是我们在JavaScript中声明变量的首选方式,它是对var
的改进,同时还是解决了var
存在的一些问题。
let
声明的变量具有块级作用域,只在声明的块内部有效。
{
let x = 10;
console.log(x); // 10
}
console.log(x); // ReferenceError: x is not defined
let
不允许重复声明同一个变量。
let x = 10;
let x = 20; // SyntaxError: Identifier 'x' has already been declared
let
不会变量提升。
console.log(x); // ReferenceError: x is not defined
let x = 10;
const
关键字
用 const
声明的变量保持恒定值。const
声明与 let
声明有一些相似之处。
const
声明的变量也具有块级作用域。
{
const x = 10;
console.log(x); // 10
}
console.log(x); // ReferenceError: x is not defined
const
声明的变量必须进行初始化,且不能再次赋值。
const x = 10;
x = 20; // TypeError: Assignment to constant variable
const
声明的变量不会变量提升。
console.log(x); // ReferenceError: x is not defined
const x = 10;
总结
var
声明的变量存在一些问题,如变量提升、全局作用域等。
let
是var
的改进,具有块级作用域、不会变量提升、不允许重复声明等特性。
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