# var

  • var 可以重复声明
  • 变量提升: var 函数声明和变量声明会被解释器“提升”到方法体的最顶部;

变量的初始化赋值并不会提升

即var a = 5 只会提升var a,不会提升a = 5这个赋值操作

a = 5
console.log(a)  // 5
console.log(b)  // undefined
var b = 3
var a

# let

  • let 不可以重复声明
  • let 不会出现变量提升
  • let 会声明块级作用域变量
c = 5
console.log(c)
// let c    // 会报错

var d = 2
function fun() {
    console.log(d)  // undefined
    var d = 4
    console.log(d)  // 4
}
fun()


// var e = 7    这种写法是错误的
if(true){
    console.log(e)
    let e = 8
    console.log(e)
}

# const

  • const 相当于let定义的常量,不可更改,但是const对象可以改
const obj = {a: 1}
obj.a = 2
console.log(obj)

const obj2 = obj
const obj3 = {...obj}   // 在堆里有了新的对象
console.log(obj === obj2)
console.log(obj === obj3)