乾貨精講:es6解構賦值

解構賦值是一個聽起來比較高大上的特性,但它就是一種語法糖。它並沒有賦予js更強大的能力,只是讓賦值操作更加的靈活,效率。

在es6之前,賦值操作需要=左邊是一個變量,右邊是一個數據或返回數據的函數等。而解構賦值,是將=右邊的結構分解(解構),然後按照格式給=左邊進行賦值,主要分為數組的解構賦值和對象的解構賦值。

乾貨精講:es6解構賦值

語法

解構賦值的格式為,=左邊為解構賦值的語法,=右邊為初始化器,即一個對象或數組。

數組的解構賦值

數組的解構賦值是基於數組位置的,比如:

乾貨精講:es6解構賦值

也可以通過解構改變變量的值。比如:

乾貨精講:es6解構賦值

當=左邊與右邊不完全匹配時,未能匹配到的變量會被賦值為undefined,比如:

乾貨精講:es6解構賦值

所以可以通過給一些變量指定默認值,以防止這種情況的發生。比如:

乾貨精講:es6解構賦值

注意:只有當在右邊找不到對應的值或值為undefined時,才會使用默認值。

有時候,解構賦值中,你可能只關心一部分數據,這時可以通過佔位符只給某些值賦值。比如:

乾貨精講:es6解構賦值

在解構賦值中,通過在變量前加…號,表示生成的變量為一個數組。比如:

乾貨精講:es6解構賦值

上面展示的情況都是可以聯合使用的,比如:

乾貨精講:es6解構賦值

對象的解構賦值

對象的解構賦值是基於屬性的。比如:

乾貨精講:es6解構賦值

與數組的解構賦值一樣,對象的解構賦值一樣給未能解構的變量賦值undefined,一樣可以使用默認值。

當給已存在的變量解構賦值時,注意加()

乾貨精講:es6解構賦值

這是由於如果不加(),js會把左邊看成一個代碼塊,會報錯。加了()後,整個變成了一個合法的表達式。

在上面的解構賦值中,變量名和對象中的屬性名必須相同,只有這樣,才能找到對應的要解構賦值的數據。但如果我們想要給數據賦一個不同的名字呢? 也是有辦法的。

乾貨精講:es6解構賦值

這樣相應的名字和年齡就被賦值給myName和myAge了。

也可以同時使用默認值:

乾貨精講:es6解構賦值

以上我們列舉的對象的解構賦值的例子都非常的簡單,但在實際開發中,JSON數據可能是非常複雜的,這時的解構賦值語法也可能變得複雜。比如:

乾貨精講:es6解構賦值

注意:每當有:出現在解構賦值中時,:左邊的標識符表示要檢查的位置,右邊表示要賦值的目標,如果右邊是{}或[]時,表示要賦值的變量在更深層次結構中。

上面的所有實例,如默認值,變量更名等特性都可能存在於一個解構賦值語句中。並且,數組的解構賦值與對象的解構賦值,也可以混合使用。這為我們從複雜的數據結構中提取相應數據提供了極大的便利。

函數參數的解構

函數參數的解構功能對於實現多參的函數是非常有用的。比如

乾貨精講:es6解構賦值

上面的函數是常用的實現多參函數的方式,name,value為必填參數,所有可選參數封裝到options中,作為options的屬性使用。但上面的函數存在一個問題就是,你只看函數的定義,是無法知道到底可選參數的名稱是什麼的?你需要閱讀函數代碼,瞭解函數才能使用它。

使用函數參數解構則直觀很多:

乾貨精講:es6解構賦值

使用同樣的使用方式可以調用這個函數。

但是這種寫法有種問題是當只傳入name和value參數時,會報錯。

更好的寫法是使用函數的默認參數。

乾貨精講:es6解構賦值

注意事項

  • 數組的解構賦值中,使用…rest的變量必須放在最後。
  • 與普通的變量的賦值語句一樣,解構賦值語句也是有值的,它的值就是=右邊的內容。

最佳實踐

在es6之前,交換兩個變量的值,需要創建一箇中間變量,類似這樣

乾貨精講:es6解構賦值

現在只需要一行代碼:

[a,b]= [b,a]

在實際開發中,數據解構是非常複雜的,使用對象屬性去層層調用的語法非常不直觀,通過解構賦值,可以讓代碼更加的直觀與簡潔。

數組的解構賦值中,有個小技巧。

乾貨精講:es6解構賦值

這樣就實現了數組的淺複製,而在以前,數組的複製都是通過concat()方法來完成。

乾貨精講:es6解構賦值


分享到:


相關文章: