ES6,全稱 ECMAScript 6.0 ES6主要是為了解決 ES5 的先天不足,比如 JavaScript 里并沒有類的概念,但是目前瀏覽器的JavaScript 是ES5版本,大多數高版本的瀏覽器也支持ES6,不過只實現了ES6的部分特性和功能。ES6是 ECMAScript 標準十余年來變動最大的一個版本,為其添加了許多新的語法特性。
① let命令
1、let命令用來聲明變量,它的用法類似于var,但是所聲明的變量只在let命令所在的代碼塊內生效。
所以在for循環中,就很適合使用let命令。
上面代碼中,i只在for循環體內有效,在循環體外就會報錯。
在下面代碼中,如果使用var,最后結果為 10。
上面代碼中,變量i是var命令聲明的,在全局范圍內都有效,所以全局變量只有一個i。每一次循環,變量i的值都會被重新賦值,而循環內被賦給數組a的函數內部的console.log(i),里面的i指向的就是全局的i。也就是說,所有數組a的成員里面的i,指向的都是同一個i,導致運行時輸出的是最后一輪的i的值,也就是 10。
如果是用let,聲明的變量僅在會計作用域內有效,結果也就為6.
上面的代碼中,變量i是let聲明的,所以i只會在本循環體中有效,因此每一次循環的i都是一個新的變量,也就是說會被重新賦值,所以結果也就為6。
另外,在for循環體中還有一個特別之處,就是設置循環變量的那一部分是一個父作用域,而循環體內是一個單獨的子作用域。
2、變量不會被提升
在var命令中會發生‘變量提升’的現象,即變量可以在聲明之前使用,值為undefined。
而let命令改變了這一語法行為,在聲明之前使用會報錯。
3、暫時性死區
何為暫時性死區?就是說只要塊級作用域內存在let命令,它所聲明的變量就‘綁定’這個區域,不再受外部的影響。
上面的代碼中,存在全局變量a,但是在塊級作用域內let又聲明了一個局部變量a,導致后者綁定了這個區域,所以在let聲明變量之前,對a的輸出會報錯。
在 ES6 中明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了一個封閉作用域。凡是在聲明之前使用這些變量就會報錯。
4、不允許重復聲明
在var中,我們知道對于一個變量,可以用var去重復聲明它。而在let中,不允許在相同的作用域內,重復聲明同一個變量。
② const命令
1、const聲明一個只讀的常量,一旦聲明,常量的值就不能被改變。
因為const聲明的變量不能更改,所以說,const一旦聲明變量,就必須立即初始化,不能留到最后再去賦值。
上面代碼表示,const只聲明不賦值,就會報錯。
2、const的作用域與let命令相同:只在聲明所在的塊級區域內有效;
3、const命令聲明的常量也是不提升的,同樣存在暫時性死區,只能在聲明的位置后面使用,且同樣不能被重復聲明。
當然const實際上保證的并不是變量的值不被改變,而是變量指向的那個內存地址所保存的數據不被改變。而對于其他類型的數據(對象、數組),變量指向的則是內存地址,保存的只是一個指向實際數據的方位,const只能保證這個方位是固定的,至于它指向的數據結構是不是可變的,就不是能控制的了。
上面代碼中,常量arr儲存的是一個地址,這個地址指向一個數組。不可變的是這個地址,即不能把arr指向另一個地址,但數組本身是可變的,所以依然可以向里面添加值。
二、解構賦值
在ES6中,允許按照一定的模式,從數組和對象中提取值,對變量進行賦值,這個被稱之為解構。
以前給變量賦值時,只能直接指定值。
在ES6中允許寫成這樣
上面代碼中表示,可以從數組中提取值,按照對應的位置,對變量賦值。
只要等號兩邊的模式相同,左邊的變量就會被賦予對應的值。
如果解構不成功,變量的值就等于undefined。
解構賦值允許指定默認值
這種情況下,只有當變量等于undefined時,默認值才會生效。
上面代碼中,如果一個數組成員是null,默認值就不會生效,因為null不嚴格等于undefined。
對象的解構賦值
解構也可以用于對象。
在對象的解構中,對象對策屬性是沒有次序之分的,只要變量與屬性同名,就能取到正確的值。
在對象的解構中,我們還可以更改變量名。
上面代碼中,foo是匹配的模式,bar才是變量,所以真正被賦值的是變量bar,而不是foo。
在對象的解構中也是可以指定默認值的,同樣、條件必須是屬性值等于undefined。
上一篇:最新常用的正則表達式大全
掃一掃 加微信咨詢