let和const
let和const是es6新增的兩個變量聲明關鍵字,與var的不同點在于:
(1)let和const都是塊級作用域,在{}內有效,這點在for循環中非常有用,只在循環體內有效。var為函數作用域。
(2)使用let和const聲明的變量,不存在變量提升,必須先聲明再使用。使用var聲明的變量可以先使用再定義。
(3)不可重復聲明。一旦用var,let或者const聲明過的變量,再次用let或者const聲明時會報錯,函數的參數名如果用let或者const在函數體內聲明同名的參數時,也會報錯。
const特殊要點:
(1)const顧名思義常量,但這個常量與高級語言的常量有所不同,這里的常量指的是在定義就確定其值,并且這個值只讀,不可以修改;高級語言的常量更狹隘一點;
(2)使用const聲明的變量,一旦聲明需要立即初始化,只聲明的變量無法用const,const a; 編譯會報錯;并且一旦初始化,就不能改變。
(3)const用于定義一個復合型對象或者數組時,只是對對象或者數組本身不可賦值,但依然可以為對象添加屬性或者為數組push元素。
解構賦值
解構是按照一定的模式,從數組和對象中提取值,對變量進行賦值,解構表達式的左側是一般[]或者{}。當解構表達式的左側是[]時,右側也必須是對應的具有可遍歷屬性的對象,因此可以是[],map或者string;當解構表達式的左側為{}時,javascript解析器會先將右側的值轉換為對象,然后從轉換的對象獲取對應的屬性值。總之,解構一個很重要的原則就是“模式匹配”,根據左側是[]或者{},對右側進行轉換,如果轉換后,兩側模式匹配,則進行解構賦值,否則報錯。
同時,解構時允許設置默認值,但這里的執行順序是:先解構,如果解構得到的值為非undefined,則變量值=解構的值,默認賦值表達式不執行;只有當解構得到的值嚴格等于undefined時,才會執行默認賦值表達式,否則默認賦值表達式是不執行的。
1.數組解構
數組的解構是按照變量的順序進行賦值的,因此變量的值與數組的順序息息相關,不同的順序,解構得到的值也不同。
2.對象解構
對象解構與數組解構不同,對象解構與元素的順序無關,對象解構的主要依據是對象的屬性,對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
3.函數參數解構
函數參數解構其實是數組解構或者對象解構的一種應用,在es6中可以為函數參數指定默認值,這點和解構一起使用,對于參數賦值非常實用。函數參數的解構同樣要求模式匹配,函數定義時的參數的數據類型和調用時傳入的參數類型保持一致。
另外:對于已經聲明的變量進行解構賦值時,要非常小心。下面的示例中,首先用let對變量進行了聲明,由于let和const聲明的變量不能重復聲明,在通過解構表達式賦值時,javascript解析器會將行首的{}解析為代碼塊,報語法錯誤。因此在行首加(),將其強制轉化為表達式執行。
4.字符串的解構賦值
字符串也可以進行解構賦值,因為字符串可以轉化為一個具有類似數組的對象。
5.數字和布爾值的解構賦值
解構賦值時,如果等號右邊是數值和布爾值,則會先轉為對象。解構賦值的規則是,只要等號右邊的值不是對象,就先將其轉為對象。由于undefined和null無法轉為對象,所以對它們進行解構賦值,都會報錯。
參考文獻:http://es6.ruanyifeng.com/#do...
http://es6.ruanyifeng.com/#do...