var
a = 1 会做什么?
如果a不存在则声明a,如果a已经存在则给a赋值
下面的代码显示了声明提升的存在:
function fn() {
if(true) {
console.log(a)
} else {
var a = 2
}
}
fn() // undefined
由于声明提升的存在,建议变量声明都放在函数的最开始
let
let 声明的变量只在 let 所在的代码块内有效
在声明之前使用直接报错 undefined,声明之前的区域称为『临时死区』
至此,js 的变量声明回到一个比较正常的状态,重复声明报错,在声明之前使用也报错
const
const 声明的变量只有一次赋值机会,并且必须在声明的同时赋值
const 保证的是变量对应的内存地址里的内容不变,对于简单类型的数据,值就是内容,对于复合类型的数据(对象和数组),内容是实际的数据地址
如果想保证对象不变,可以使用 Object.freeze(),同时需要递归处理对象的属性