let和var的一些區(qū)別
- var存在變量提升今妄,let不存在變量提升
console.log(a) //undefined
console.log(b) //"ReferenceError: a is not defined
var a=1
let b=2
暫時(shí)性死區(qū)(temporal dead zone,簡(jiǎn)稱 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
暫時(shí)性死區(qū)的本質(zhì)就是境析,只要一進(jìn)入當(dāng)前作用域痊硕,所要使用的變量就已經(jīng)存在了场钉,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn)敢辩,才可以獲取和使用該變量蔽莱。
- let不可以重復(fù)聲明
let a=1
let a=2 //"SyntaxError: Identifier 'a' has already been declared
- 塊級(jí)作用域
{
var a=1
}
console.log(a) //1
{
let b=1
}
console.log(b) //"ReferenceError: b is not defined
const用法與let一致,區(qū)別在于const聲明只讀常量
const A=1
A=2 //"TypeError: Assignment to constant variable.
const實(shí)際上保證的戚长,并不是變量的值不得改動(dòng)盗冷,而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)。對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值同廉、字符串仪糖、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址迫肖,因此等同于常量乓诽。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址咒程,保存的只是一個(gè)指針鸠天,const只能保證這個(gè)指針是固定的
const A={}
A.a=1
console.log(A) //Object {a: 1}
A=['a','b'] //"TypeError: Assignment to constant variable.