1 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
這問(wèn)題的重點(diǎn)在const與let的相較,我先說(shuō)明一下const。
在ES6之前,并沒(méi)有"常量"這個(gè)東西,只有"變量"而已,也就是用var
所聲明的識(shí)別名稱。在這份舊的Google JavaScript樣式風(fēng)格指引中,會(huì)告訴你要用全大寫英文字符來(lái)作為常量定義,像是var MAX_HEIGHT = 10
這種定義方式,甚至是使用非常特別的注釋中的@const
標(biāo)記,有可能Google Chrome瀏覽器會(huì)在內(nèi)部處理時(shí)認(rèn)得它是個(gè)常量,但很少見(jiàn)到有人這樣用,畢竟也只有對(duì)Chrome有用而已。對(duì)JavaScript來(lái)說(shuō),用var
來(lái)聲明就是個(gè)變量。
const
針對(duì)是常量的聲明,常量在一聲明時(shí)就必定要賦給值,不然會(huì)產(chǎn)生錯(cuò)誤。而對(duì)于常量在ES6的定義是:
不可再賦值(can't re-assignment)
賦值的意思就是用等號(hào)(=)作賦值運(yùn)算,像下面這例子就是再賦值(或重覆賦值),所以會(huì)產(chǎn)生錯(cuò)誤:
const a = 10a = 20 // 錯(cuò)誤TypeError: Assignment to constant variable.
注: JS中的賦值運(yùn)算符除了等號(hào)(=)外,還有多種等號(hào)(=)與其他運(yùn)算符組合而成的賦值運(yùn)算符,請(qǐng)參考MDN的Assignment_Operators
聲明了一個(gè)常量,代表這個(gè)識(shí)別名稱的參照(reference)是唯讀的(read-only),并不代表這個(gè)參照賦到的值是不可改變的(immutable),"const"只是針對(duì)存取層級(jí)的限制(access limitations),并不是不可改變性(immutability)。
上面這段這是在講什么?這是在講如果你聲明的常量是一個(gè)對(duì)象、函數(shù)(也是對(duì)象)或數(shù)組類型,像這種參照類型的值,里面的值是可以再作改變的。像下面的例子都是合法的使用:
const a = [] a[0] = 1const b = {} b.foo = 123
所以對(duì)于對(duì)象、數(shù)組、函數(shù)來(lái)說(shuō),使用const
常量來(lái)聲明就可以,除非你有需要再對(duì)這個(gè)數(shù)組或?qū)ο蟮膮⒄罩匦沦x值。
雖然"const"是來(lái)自英文中的"constant"(常量)字詞的縮寫,但在ES6的標(biāo)準(zhǔn)文檔中,經(jīng)常會(huì)在規(guī)則中,用對(duì)"variable"(變量)這個(gè)字詞,一并說(shuō)明這兩個(gè)共同的特性,上面的錯(cuò)誤消息中就可以看到"constant variable"(固定的變量/不會(huì)變的變量),這意思較為接近,也就是把它當(dāng)成是一種擁有固定值特性的變量來(lái)看待。ES6中對(duì)"const"與"let"仍然有區(qū)分,在區(qū)分中的說(shuō)明章節(jié),是對(duì)于詞法環(huán)境綁定(就塊級(jí)作用域),是否為可改變的(lexEnvRec.CreateMutableBinding)或不可改變的(lexEnvRec.CreateImmutableBinding)兩種情況。
添加回答
舉報(bào)