解構賦值是一個聽起來比較高大上的特性,但它就是一種語法糖。它並沒有賦予js更強大的能力,只是讓賦值操作更加的靈活,效率。
在es6之前,賦值操作需要=左邊是一個變量,右邊是一個數據或返回數據的函數等。而解構賦值,是將=右邊的結構分解(解構),然後按照格式給=左邊進行賦值,主要分為數組的解構賦值和對象的解構賦值。
語法
解構賦值的格式為,=左邊為解構賦值的語法,=右邊為初始化器,即一個對象或數組。
數組的解構賦值
數組的解構賦值是基於數組位置的,比如:
也可以通過解構改變變量的值。比如:
當=左邊與右邊不完全匹配時,未能匹配到的變量會被賦值為undefined,比如:
所以可以通過給一些變量指定默認值,以防止這種情況的發生。比如:
注意:只有當在右邊找不到對應的值或值為undefined時,才會使用默認值。
有時候,解構賦值中,你可能只關心一部分數據,這時可以通過佔位符只給某些值賦值。比如:
在解構賦值中,通過在變量前加…號,表示生成的變量為一個數組。比如:
上面展示的情況都是可以聯合使用的,比如:
對象的解構賦值
對象的解構賦值是基於屬性的。比如:
與數組的解構賦值一樣,對象的解構賦值一樣給未能解構的變量賦值undefined,一樣可以使用默認值。
當給已存在的變量解構賦值時,注意加()
這是由於如果不加(),js會把左邊看成一個代碼塊,會報錯。加了()後,整個變成了一個合法的表達式。
在上面的解構賦值中,變量名和對象中的屬性名必須相同,只有這樣,才能找到對應的要解構賦值的數據。但如果我們想要給數據賦一個不同的名字呢? 也是有辦法的。
這樣相應的名字和年齡就被賦值給myName和myAge了。
也可以同時使用默認值:
以上我們列舉的對象的解構賦值的例子都非常的簡單,但在實際開發中,JSON數據可能是非常複雜的,這時的解構賦值語法也可能變得複雜。比如:
注意:每當有:出現在解構賦值中時,:左邊的標識符表示要檢查的位置,右邊表示要賦值的目標,如果右邊是{}或[]時,表示要賦值的變量在更深層次結構中。
上面的所有實例,如默認值,變量更名等特性都可能存在於一個解構賦值語句中。並且,數組的解構賦值與對象的解構賦值,也可以混合使用。這為我們從複雜的數據結構中提取相應數據提供了極大的便利。
函數參數的解構
函數參數的解構功能對於實現多參的函數是非常有用的。比如
上面的函數是常用的實現多參函數的方式,name,value為必填參數,所有可選參數封裝到options中,作為options的屬性使用。但上面的函數存在一個問題就是,你只看函數的定義,是無法知道到底可選參數的名稱是什麼的?你需要閱讀函數代碼,瞭解函數才能使用它。
使用函數參數解構則直觀很多:
使用同樣的使用方式可以調用這個函數。
但是這種寫法有種問題是當只傳入name和value參數時,會報錯。
更好的寫法是使用函數的默認參數。
注意事項
- 數組的解構賦值中,使用…rest的變量必須放在最後。
- 與普通的變量的賦值語句一樣,解構賦值語句也是有值的,它的值就是=右邊的內容。
最佳實踐
在es6之前,交換兩個變量的值,需要創建一箇中間變量,類似這樣
現在只需要一行代碼:
[a,b]= [b,a]
在實際開發中,數據解構是非常複雜的,使用對象屬性去層層調用的語法非常不直觀,通過解構賦值,可以讓代碼更加的直觀與簡潔。
數組的解構賦值中,有個小技巧。
這樣就實現了數組的淺複製,而在以前,數組的複製都是通過concat()方法來完成。
閱讀更多 渡一教育web前端開發 的文章