var
- 声明的变量具有函数作用域或者全局作用域;
- 存在变量提升,即在执行上下文中,变量会被提升到函数或全局作用域的顶部,但初始化的赋值不会提升;
- 可以重复声明同一个变量不会报错;
- 可以被重新赋值;
- 声明的变量会成为全局变量;
- 没有暂时性死区,可以在声明之前访问变量,值为 undefined。
let
- 声明的变量具有块级作用域,即在
{}
内部声明的变量只能在该内部可见; - 也存在变量提示,但是在初始化之前访问会导致暂时性死区,在变量声明之前访问会跑出错误;
- 在统一作用域内重复声明同一变量会报错;
- 可以被重新赋值;
- 不可成为全局属性;
- 暂时性死区内访问会抛出错误。
const
- 声明的变量具有块级作用域,即在
{}
内部声明的变量只能在该内部可见; - 也存在变量提示,但是在初始化之前访问会导致暂时性死区,在变量声明之前访问会跑出错误;
- 在统一作用域内重复声明同一变量会报错;
- 如果声明的变量是常量,重新赋值就不能改变,
----如果使用 const 声明一个对象或数组,可以修改对象或数组的属性或元素,但不能重新赋值一个新的对象或数组给这个变量。
----对于使用 const 声明的对象或数组,虽然不能重新赋值一个新的对象或数组给这个变量,但可以修改对象或数组的属性或元素。这是因为 const 保证的是变量指向的引用不变,而不是引用的值不变。
5. 声明的变量不会成为全局对象的属性
6. 暂时性死区内访问会抛出错误。