基礎知識梳理~ES6 解構賦值

LJUp發表於2019-12-14

解構賦值

陣列解構

兩邊有相同結構,一一對應賦值,解構不成功自動賦值undefined,如[a,b] = [1,2],若左邊陣列多個變數c,c解構不成功被賦值undefined

引數預設值

  • [a= 10,b =5] = [2,3],若右側不傳值,會使用預設值,傳值會把預設值覆蓋
  • 右側的值只有嚴格等於(===)undefined(直接寫undefined或不寫),左側才會使用預設值,'undefined'和null都會覆蓋預設值
  • 若預設值是一個表示式,那只有在用到預設值時才會執行表示式(惰性求值)
  • 預設值可以引用解構賦值的其他變數,但該變數必須是一件宣告的變數
  • 常用於函式的形參

物件解構

特點

  • 兩邊結構相同

  • 物件屬性無序

  • 變數名必須等於屬性名

    • 如解構失敗,變數名賦值undefined

內部機制

  • 物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。
  • let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' }; 其中前一個foo是匹配的模式,後一個foo才是被賦值的變數
  • 物件的解構賦值是以上形式的簡寫
  • 利用該機制可將物件屬性賦值給不同名的變數
  • 物件的解構賦值可以取到繼承的屬性,其原型的屬性

預設值

  • 和陣列解構相同,預設值生效的條件時物件的屬性值嚴格等於undefined

巢狀結構

  • 由於沒有陣列的一一對應,可以有多個變數獲取一個物件中不同巢狀層級的子物件
  • 如果解構模式是巢狀的物件,而且子物件所在的父屬性不存在,那麼將會報錯。

應用

  • 可提取已存在物件的屬性方法

注意

1,對已經宣告的變數進行解構賦值,應將整個解構賦值表示式用()括起,避免解構物件寫在行首被解析為程式碼塊

2,解構賦值左邊的模式中可以不放置變數,沒有效果,但不會報錯

3,陣列是特殊的物件,因此可以對陣列進行物件屬性的解構,如let {0 : first, [arr.length - 1] : last} = arr;取得陣列的第1個數和最後一個數

4,函式的形參若是一個物件等於一個物件,表示後一個物件為前一個物件的預設值,若外部傳入實參物件,只要不為undefined就會代替預設值賦給前一個物件,然後這兩個物件再進行解構賦值,等於進行了兩次解構賦值

5,其他資料型別的解構賦值

  • 字串也可以解構賦值,此時字串會被轉換為一個類陣列物件,甚至可以取得其length屬性
  • 數值和布林值也可以解構賦值,轉換為其包裝物件,可以獲取其具有的屬性,如toString
  • undefined和null因無法轉換為物件,所以對其進行解構賦值會報錯

建議儘量不要在模式(物件解構內部機制中有提到)中用圓括號()

  • 變數宣告語句不能用
  • 函式引數不能用
  • 賦值語句的模式部分
  • 只有賦值語句的非模式部分可以用

應用

交換變數值,如 [a,b] = [b,a]

從陣列或變數中取值

函式引數傳值及設定預設值

提取json資料

基礎決定未來,一步一個腳印

相關文章