var 特性
- 存在变量提升
console.log(a) // undefined
var a = 2
- 非块级作用域
const a = []
for(var i = 0; i < 10; i++) {
a[i] = function(){
return i
}
}
console.log(a[5]()) // 添加()调用函数,输出 10
- 可重复申明,不会报错
var a = 2
var a = 3 // 不会报错
- 会造成全局变量的污染, let 和 const不会出现类似情况
console.log(window.RegExp) // function(){ .... }
var RegExp = 3
console.log(RegExp) //3
console.log(window.RegExp) //3
let 特性
- 不存在变量提升
console.log(a) //报错
let a = 3
- 块级作用域
let a = 3
if(true) {
let a = 2
console.log(a)
}
console.log(a) // 依次输出 2 3
- 不可重复声明
let a = 2
let a = 3 //报错
const 特性
const 特性和上述的let相同 唯一不同的地方在于 const声明变量后,值不能再修改, 而let可以修改
const a = 2
a = 3 //报错
let a = 2
a = 3 // ok
const a = {
name: 'Jack'
}
a.name = 'tt'
console.log(a) // 对象属性变化了,还是可执行
const a = { name: 'Jack' }
a = { name: 'nobody' }
console.log(a) // 对象变化了,不可执行,报错