JavaScript中的var、let和const声明之间有什么区别?

2020-11-13大约6分钟

这是JavaScript面试中最常见的问题。在ES6出现之前,var是JavaScript里面声明变量的唯一方式,在ES6出现之后,才出现了let和const关键字来声明变量。具体可以参见前面写的三篇文章:

问题1:var和ES5中的let / const有什么区别?

特性 var let/const
创建块作用域 x
重新声明 x
提升(hoisted) x

从语言设计上,letconst更加规范,避免了之前var带来的种种弊端。

问题2: let和const有什么区别?

特性 let const
重新赋值 x
声明时未赋值 默认值是undefined 报错:SyntaxError: Missing initializer in const declaration

问题3: 可以更改用const声明的变量的值吗?

是的,可以更改引用的对象,但是不能更改引用本身,即不能给const声明的变量赋新对象。以const声明的数组为例:我们不能赋另一个数组,但是可以更改现有数组的值,因为引用未更改。

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

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

结论

在目前推荐的编码风格中:

  • 不使用var
  • 不改变值或引用,用const来声明。
  • 需要改变值或引用,用let来声明。