? ? ? ?今天說一下,let、const、var還有數(shù)組的解構(gòu)賦值,不得不說上班偷偷干自己的事情還是挺爽的。let、const、var這三個都可以用來聲明變量,但是let和const是es6新出的玩意,而var是之前已經(jīng)都有的已經(jīng)存在的東西。關(guān)于var我們就不多說了,反正平常也是經(jīng)常用,就是聲明個變量啥的,重點還是要講一下let和const。至于解構(gòu)賦值,就是數(shù)組按照一定的模式從數(shù)組和對象中提取出來值然后對變量賦值,其實就是找規(guī)律看眼緣。
? ? ? ?首先我們說下塊級作用域,在es5呢只存在全局作用域和函數(shù)作用域,而es6中新加了個塊級作用域,原因呢就是因為原有的內(nèi)容存在著不便(這句好像是廢話);首先是原來的那些個作用域會因為這什么變量提前(就是你還沒有聲明就已經(jīng)調(diào)用)而導(dǎo)致數(shù)據(jù)獲取的錯誤,其次就是因為循環(huán)導(dǎo)致的全局變量泄漏(這個一些在for循環(huán)里做click操作什么的都知道)。所以我們引入塊級作用域,啥叫塊級作用域呢,可以理解為任意兩個大括號{}之間都可以算作塊級作用域或者let和const聲明變量的地方也可以算作塊級作用域。
? ? ?let呢,作用跟var類似,聲明變量,但是let聲明的變量只在let命令所在的代碼塊里面有效(let是老大在這塊),在這個代碼塊之外就不會被認識(類似于出了這個門就六親不認),但是var不同,函數(shù)作用域可以調(diào)用全局作用域聲明的變量,也可以調(diào)用自己函數(shù)作用域的變量,并且采取相同變量名的就近原則,你要是這么用let,那就是報錯。而且在let的代碼塊里,let和var不能聲明同一個變量不然還是報錯,而且你不能在未聲明之前調(diào)用這樣也會報錯(這點類似于function,叫什么暫時性死區(qū),這話跟function那個不搭),反正意思就是有l(wèi)et的地方,let聲明的變量就是小公主,人是最大的,最好的,必須要不一樣,必須要讓人排前面。
? ? ?const呢,跟let差不多,但是它聲明一個只讀變量,而且你聲明的時候就得進行初始化,不然就給你報錯。當(dāng)然const聲明的變量呢簡單數(shù)據(jù)就是內(nèi)存中存儲變量值,復(fù)雜的數(shù)據(jù)呢內(nèi)存中存的是地址,這也就造成了const聲明的簡單數(shù)據(jù)不可改變,而復(fù)雜的數(shù)據(jù)你還可以往里面扔點數(shù)據(jù)屬性啥的,畢竟只要內(nèi)存中的地址不變,你隨便搞。其他的大致跟let命令差不多。
? ? ? ?根據(jù)let、const和var,還有這些個作用域的劃分,大致以后window(瀏覽器端)就不能當(dāng)全局對象使了,畢竟你搞個let塊里面的命令window也讀不到,但是好像global(node端)要當(dāng)全局對象使了,不過這些都是看大佬的文章說的,至于是不是那樣我就不知道了。
? ? ? ? 接下來說解構(gòu)賦值,數(shù)組的結(jié)構(gòu)賦值就是根據(jù)對應(yīng)位置為對應(yīng)變量賦值,如果對應(yīng)位置取不到值那么就賦值為undefined;對象的解構(gòu)賦值就是根據(jù)對應(yīng)的key提取value值賦給對應(yīng)變量值,取不到對應(yīng)的值就賦給undefined;函數(shù)的解構(gòu)賦值就是按照參數(shù)對應(yīng)數(shù)組或者對象的解構(gòu)賦值綜合起來進行的;解構(gòu)賦值還可以給它賦默認值(類似于初始化),而且還可以用嵌套賦值(說白了就是取對象的某個屬性)。至于像字符串的解構(gòu)賦值就是將字符串轉(zhuǎn)為數(shù)組取里面對應(yīng)位置的值或者屬性,而number和boolean則是轉(zhuǎn)為對象再去按照對象解構(gòu)賦值方法取搞,null和undefined無法轉(zhuǎn)為對象和數(shù)組所以你要是瞎搞就報錯。還有就是小心圓括號造成的問題,聲明的變量 函數(shù)的參數(shù)和賦值語句只要和值的類型不對應(yīng)都會出錯,所以一定要注意?。。?!