一、對象解構
在此代碼中,, node.type 的值被存儲到 type 本地變量中,, node.name 的值則存儲到name 變量中。此語法相同于簡寫的屬性初始化器,。 type 與 name 標識符既聲明了本地變量,,也讀取了對象的相應屬性值。
以上對象解構示例都用于變量聲明,。不過,,也可以在賦值的時候使用解構。例如,,你可能想
在變量聲明之后改變它們的值,,如下所示:
在本例中, type 與 name 屬性在聲明時被初始化,,而兩個同名變量也被聲明并初始化為不同的值,。接下來一行使用了解構表達式,通過讀取 node 對象來更改這兩個變量的值,。注意你必須用圓括號包裹解構賦值語句,,這是因為暴露的花括號會被解析為代碼塊語句,而塊語句不允許在賦值操作符(即等號)左側出現(xiàn),。圓括號標示了里面的花括號并不是塊語句,、而應該被解釋為表達式,從而允許完成賦值操作,。
二,、解構賦值表達式的值為表達式右側(在 = 之后)的值
outputInfo() 函數(shù)被使用一個解構賦值表達式進行了調用。該表達式計算結果為 node ,,因為這就是表達式右側的值,。對 type 與 name 的賦值正常進行,同時 node 也被傳入了outputInfo() 函數(shù),。
當解構賦值表達式的右側( = 后面的表達式)的計算結果為 null 或 undefined 時,,會拋出錯誤。因為任何讀取 null 或 undefined 的企圖都會導致“運行時”錯誤(runtime error ),。
三,、默認值
當你使用解構賦值語句時,如果所指定的本地變量在對象中沒有找到同名屬性,,那么該變量會被賦值為 undefined ,。例
你可以選擇性地定義一個默認值,以便在指定屬性不存在時使用該值。若要這么做,,需要在屬性名后面添加一個等號并指定默認值,,就像這樣:
在此例中,變量 value 被指定了一個默認值 true ,,只有在 node 的對應屬性缺失,、或對應的屬性值為 undefined 的情況下,該默認值才會被使用,。
四,、重新指定變量名
ES6 有一個擴展語法,允許你在給本地變量賦值時使用一個不同的名稱,,而且該語法看上去就像是使用對象字面量的非簡寫的屬性初始化。
你也可以給變量別名添加默認值,,依然是在本地變量名稱后添加等號與默認值,,例如:
五、嵌套的對象解構
使用類似于對象字面量的語法,,可以深入到嵌套的對象結構中去提取你想要的數(shù)據(jù),。
本例中的解構模式使用了花括號,表示應當下行到 node 對象的 loc 屬性內(nèi)部去尋找start 屬性,。記住上一節(jié)介紹過的,,每當有一個冒號在解構模式中出現(xiàn),就意味著冒號之前的標識符代表需要檢查的位置,,而冒號右側則是賦值的目標,。當冒號右側存在花括號時,表示目標被嵌套在對象的更深一層中,。
六,、數(shù)組解構
你也可以在解構模式中忽略一些項,并且只給感興趣的項提供變量名,。例如,,若只想獲取數(shù)組中的第三個元素,那么不必給前兩項提供變量名,。以下展示了這種方式:
七,、數(shù)組解構賦值
你可以在賦值表達式中使用數(shù)組解構,但是與對象解構不同,,不必將表達式包含在圓括號內(nèi),,例如:
數(shù)組解構賦值有一個非常獨特的用例,能輕易地互換兩個變量的值,。
八,、數(shù)組結構默認值
九、數(shù)組嵌套的解構
與解構嵌套的對象相似,可以用類似的方式來解構嵌套的數(shù)組,。在整個解構模式中插入另一個數(shù)組模式,,解構操作就會下行到嵌套的數(shù)組中
十、數(shù)組解構剩余項
相比函數(shù)的剩余參數(shù),,數(shù)組解構有個類似的,、名為剩余項( rest items )的概念,它使用 ... 語法來將剩余的項目賦值給一個指定的變量,,此處有個范例:
十一,、剩余項的另一個有用的功能是克隆數(shù)組
方便地克隆數(shù)組在 JS 中是個明顯被遺漏的功能。在 ES5 中開發(fā)者往往使用的是一個簡單的
方式,,也就是用 concat() 方法來克隆數(shù)組,,例如:
盡管 concat() 方法的本意是合并兩個數(shù)組,但不使用任何參數(shù)來調用此方法,,就會獲得原數(shù)組的一個克隆品,。而在 ES6 中,你可以使用剩余項的語法來達到同樣效果,。實現(xiàn)如下:
剩余項必須是數(shù)組解構模式中最后的部分,,之后不能再有逗號,否則就是語法錯誤,。
十二,、混合解構
對象與數(shù)組解構能被用在一起,以創(chuàng)建更復雜的解構表達式,。在對象與數(shù)組混合而成的結構中,,這么做便能準確提取其中你想要的信息片段。例如:
十三,、參數(shù)解構-解構還有一個特別有用的場景,,即在傳遞函數(shù)參數(shù)
參數(shù)解構提供了更清楚地標明函數(shù)期望輸入的替代方案。它使用對象或數(shù)組解構的模式替代了具名參數(shù),。要看到其實際效果,,請查看下例中重寫版本的 setCookie() 函數(shù):
此函數(shù)的行為類似上例,但此時第三個參數(shù)使用了解構來抽取必要的數(shù)據(jù)?,F(xiàn)在對于setCookie() 函數(shù)的使用者來說,,解構參數(shù)之外的參數(shù)明顯是必需的;而可選項目存在于額外的參數(shù)組中,,這同樣是非常明確的,;同時,若使用了第三個參數(shù),,其中應當包含什么值當然也是極其明確的,。解構參數(shù)在沒有傳遞值的情況下類似于常規(guī)參數(shù),,它們會被設為undefined 。
參數(shù)解構擁有此前你在本章已經(jīng)學過的其他解構方式的所有能力,。你可以在其中使用默認參數(shù),、混合解構,或使用與屬性不同的變量名
十四,、函數(shù)解構的參數(shù)是必需的
參數(shù)解構有一個怪異點:默認情況下調用函數(shù)時未給參數(shù)解構傳值會拋出錯誤,。例如,用以下方式調用上例中的 setCookie() 函數(shù)就會出錯:
沒有傳遞結構參數(shù)時,,相當于第三個參數(shù)是undefined,,既然在賦值右側的值為 null 或 undefined 時,解構會拋出錯誤,,那么未向 setCookie()函數(shù)傳遞第三個參數(shù)就同樣會出錯,。
若你讓解構的參數(shù)作為必選參數(shù),那么上述行為并不會令人困擾,。但若你要求它是可選的,,可以給解構的參數(shù)提供默認值來處理這種行為,就像這樣:
十五,、參數(shù)解構的默認值
你可以為參數(shù)解構提供可解構的默認值,就像在解構賦值時所做的那樣,,只需在其中每個參數(shù)后面添加等號并指定默認值即可,。
備注:文章內(nèi)容來源于《深入理解ES6翻譯完整版》