var
直接定义到window上
var a = 1
window.a // 1
声明提升(预编译)
console.log(a) // undefined
var a = 1
let
声明不提升
console.log(a) // 报错 Uncaught ReferenceError: a is not defined
let a = 1
暂时性死区:如果某个代码块中有let指令,外部有名称相同的变量,两者互不影响
var a = 1
if (true) {
var a = 2
console.log(a) // 2
}
console.log(a) // 2
if (true) {
let a = 3
console.log(a) // 3
}
console.log(a) // 2
同一代码块中不可重复声明
let a = 1
let a = 2 // Identifier 'a' has already been declared
const
声明不提升,暂时性死区,同一代码块中不可重复声明(同let)
const声明一个只读的常量,声明的时候必须初始化赋值,一旦声明,常量的值就不能改变
const a = 1
a = 2 // Assignment to constant variable
const其实保证的不是变量不可改变,而是变量指向的内存地址所保存的数据不可改变
基本数据类型: 值就保存在变量指向的内存地址,等同于常量。不能改变值。
复杂数据类型: 该类型变量名不指向数据,而是指向数据所在的地址,const只保证变量名指向的地址不变,并不保证改地址的数据不变,因此可以对该地址的属性值进行修改,但是不能改变地址指向。
const a = {x: 1}
a.x = 2
console.log(a) // {x: 2}
a = {x: 3} // Assignment to constant variable