let和var的一些区别
- var存在变量提升,let不存在变量提升
console.log(a) //undefined
console.log(b) //"ReferenceError: a is not defined
var a=1
let b=2
暂时性死区(temporal dead zone,简称 TDZ)
a=2 //"ReferenceError: a is not defined
let a
console.log(typeof keke) //undefined
console.log(typeof a) //"ReferenceError: a is not defined
let a
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
- let不可以重复声明
let a=1
let a=2 //"SyntaxError: Identifier 'a' has already been declared
- 块级作用域
{
var a=1
}
console.log(a) //1
{
let b=1
}
console.log(b) //"ReferenceError: b is not defined
const用法与let一致,区别在于const声明只读常量
const A=1
A=2 //"TypeError: Assignment to constant variable.
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的
const A={}
A.a=1
console.log(A) //Object {a: 1}
A=['a','b'] //"TypeError: Assignment to constant variable.