解構賦值
陣列解構
兩邊有相同結構,一一對應賦值,解構不成功自動賦值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資料
基礎決定未來,一步一個腳印