- var声明的变量会挂载到window上,而let和const声明的变量不会
var a = 'foo'
console.log(window.a)
let b = 'bar'
console.log(window.b)
const c = 'baz'
console.log(window.c)
- var 存在变量提升,而let和const不存在变量提升,let和const上面的区域称为“暂时性死区”,在定义之前不可以使用
console.log(a)
var a = 'foo'
console.log(b)
let b = 'bar'
console.log(c)
const c = 'baz'
if (true) {
var a = 'foo'
let b = 'bar'
}
console.log(a)
console.log(b)
if (true) {
var a = 'foo'
const c = 'baz'
}
console.log(a)
console.log(c)
- 在同一个作用域下,let和const不能再次声明同一个变量,而var可以
var a = 'foo'
var a = 'bar'
console.log(a)
let b = 'foo'
let b = 'bar'
console.log(b)
const c = 'foo'
const c = 'bar'
console.log(c)
- let定义变量之后可以修改,而const表面上像是声明一个“常量”。const并不是保证变量的值不得改动,而是指变量指向的内存地址不得改变。对于简单数据类型(Number、String、Boolean),值就保存在变量指向的内存地址,因此等同于常量;而对于复合数据类型(主要是对象和数组),变量只是保存了指向堆内存的地址,至于堆内的数据是不是可变的,就不能控制了。
const person = {}
person.name = 'maoxiaoxing'
console.log(person)
person = {name: 'king'}
const a = ['foo']
a.push('bar')
a[2] = 'baz'
console.log(a)