这是JavaScript面试中最常见的问题。在ES6出现之前,var是JavaScript里面声明变量的唯一方式,在ES6出现之后,才出现了let和const关键字来声明变量。具体可以参见前面写的三篇文章:
特性 | var | let/const |
---|---|---|
创建块作用域 | x | √ |
重新声明 | √ | x |
提升(hoisted) | √ | x |
从语言设计上,let
和const
更加规范,避免了之前var
带来的种种弊端。
特性 | let | const |
---|---|---|
重新赋值 | √ | x |
声明时未赋值 | 默认值是undefined | 报错:SyntaxError: Missing initializer in const declaration |
是的,可以更改引用的对象,但是不能更改引用本身,即不能给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
来声明。