let 與 var的區(qū)別
在ES6中畅买,新增了let來(lái)聲明變量,那么它與var有什么區(qū)別呢帝火?
-
作用域不一樣:用var聲明變量湃缎,只有函數(shù)作用域和全局作用域,沒有塊級(jí)作用域九巡,也就是說可以在代碼塊{}中使用蹂季,而let可以實(shí)現(xiàn)塊級(jí)作用域,用let聲明的變量撒汉,只能在{}中使用父能,在{}外部不能使用,
-
let沒有變量提升:ES6規(guī)定溉委,如果區(qū)塊中含有l(wèi)et和const(定義常量)命令,這些區(qū)塊對(duì)這些命令聲明的變量坡慌,從一開始就形成了封閉作用域藻三,凡在聲明之前使用,就會(huì)報(bào)錯(cuò)熄求,一句話逗概,在代碼塊中,在用let聲明變量之前卿城,該變量是不可用的铅搓。這在語(yǔ)法上,稱為“暫時(shí)性時(shí)區(qū)”(temporal dead zone多望,簡(jiǎn)稱TDZ)
-
let變量不能重復(fù)聲明:用var聲明變量蹋偏,比如定義了a = 1,重復(fù)定義a = 2枢纠,此時(shí)a = 2就會(huì)覆蓋a = 1黎棠,而let不會(huì),用let聲明過的變量木西,不能在被聲明
-
循環(huán)作用域:在for循環(huán)中随静,不僅{}會(huì)產(chǎn)生塊級(jí)作用域,()也會(huì)生成塊級(jí)作用域恋捆,()作用域是{}作用域的父級(jí)作用域,var聲明的變量膜毁,包括循環(huán)體內(nèi)和循環(huán)體外愤钾,而let聲明的變量作用域只在循環(huán)體內(nèi),循環(huán)體外的變量不受影響
const常量的聲明
const聲明一個(gè)只讀變量杂瘸,聲明之后不能改變劲装,意味著占业,一旦聲明纯赎,必須初始化,而且不能被重新賦值和重新聲明
用const聲明常量念恍,一般使用大寫字母晚顷,關(guān)于上文的“暫時(shí)性死區(qū)”,同樣適用于const该默,
看上圖栓袖,為什么NAME不能改變,而ARR可以改變呢音榜?因?yàn)镹AME是字符串捧弃,是基本數(shù)據(jù)類型;而ARR是數(shù)組嘴办,是引用數(shù)據(jù)類型,引用數(shù)據(jù)類型使用const聲明時(shí)户辞,只要保證內(nèi)存地址不變就行了∪姓ィ看下圖:
因?yàn)锳RR的地址變了枢希,所以就報(bào)錯(cuò)了