重复定义 | 修改值 | 声明提升 | 块级作用域 | 循环 | |
---|---|---|---|---|---|
var | 可以 | 可以 | 会 | 严格来说不支持(function可以) | 可以 |
let | 不可以 | 可以 | 不会 | 支持 | 可以 |
const | 不可以 | 不可以(对象和数组除外) | 不会 | 支持 | 不可以(for of和for in循环除外) |
- 同一作用域中不能使用
let/const
重复定义已经存在的标识符。在声明const
常量的时候必须进行初始化。 - js中的
const
常量如果是对象/数组,则对象/数组中的属性值可以修改,但不允许修改绑定。因为const
存放的是对象/数组的引用地址。 - 由于
let/const
声明不会被提升,所以一般将let/const
声明放在封闭代码块的顶部,以便整个代码块都可以访问。 var
声明的循环中,每一次迭代都同时共享这个该变量,循环内部创建的函数全部保留了对相同变量的引用(常考:闭包,使用立即执行函数或者let来解决)。let
声明的循环中,每一次迭代都会创建一个新变量,并以之前迭代中同名变量的值将其初始化。对for
、for in
、for of
循环都是一样的表现。const
声明的循环:对于普通的for
循环而言,可以在初始化变量时使用const
,但要更改这个变量的值就会抛出错误,使用如果后续循环不会修改该变量,则可以使用const
声明;在for in
或者for of
循环中,每一次迭代都会创建一个新绑定,与let
一样可以正常使用,但唯一的区别是,循环内不能修改key的值。