typora-結合gitee+PicGO設定圖床
阿新 • • 發佈:2021-12-17
解構賦值
注意:解構賦值宣告和賦值必須在一起,不能先聲明後賦值
//不可以這樣寫,會報錯****
let [a,b];
[a,b]=[1,2]
- 陣列的解構賦值
//陣列的解構賦值 //在以前我們想要定義三個變數的話 let a = 1; let b = 2; let c = 3; console.log(a); //1 console.log(b); //2 console.log(c); //3 //es6之後我們可以利用解構賦值,就可以一 一對應 let [a, b, c] = [1, 2, 3]; console.log(a); //1 console.log(b); //2 console.log(c); //3
(1)只要等號兩邊的模式是相同的,就可以解構成功。注意這裡指的是資料形式要一模一樣,不一樣會報錯
let [a,[b],c]=[1,[3],8]
console.log(a); //1
console.log(b); //3
console.log(c); //8
//以下情況就會報錯,因為b是陣列型別,而3是基本資料型別,兩個資料形式不一致
let [a,[b],c]=[1,3,8]
console.log(a); //1
console.log(b); //3
console.log(c); //8
(2)等號兩邊資料模式不一樣會報錯,但是等號兩邊資料數量可以不同。
//右側資料少,左右兩邊會根據順序進行匹配,c沒有資料與之匹配就是undefined let [a,b,c]=[1,3] console.log(a); //1 console.log(b); //3 console.log(c); //undefined //左側資料少,已有的會被解構成功 let [a,b]=[1,3,9] console.log(a); //1 console.log(b); //3
(3)等號右邊必須是可遍歷的,如果是不可遍歷的資料會報錯
let [a]=1
console.log(a); //1 is not iterable
(4)指定預設值,在解構賦值中允許指定預設值。當一個位置沒有值的時候,頁就是當模式相同,但是右邊沒有值的時候可以指定預設值。預設值只有是undefined才能生效,否則以右邊的值為準
let [a,b,c=3]=[1,2];
console.log(a); //1
console.log(b); //2
console.log(c); //3
- 物件的解構賦值
變數的解構賦值和陣列的解構賦值不太一樣:
陣列的解構賦值:元素是按次序排列的,變數的取值由變數所處的位置決定
物件的解構賦值:物件的屬性沒有次序,因此變數必須和屬性同名才能取到 正確的值
//從程式碼中可以看出來物件解構賦值的時候是和順序無關的,而屬性名字就顯得尤為重要。
let { foo, bar } = { bar: '我是bar', foo: '我是foo' }
console.log(foo); // 我是foo
console.log(bar); // 我是bar
變數名與屬性名不一致時賦值
let{a:b}={a:1}
console.log(b);//1
console.log(a);//a is not defind
//先找到同名屬性,在賦值給對應的變數,所以真正賦值的是後面的變數,也就是b,而不是前面的屬性名
- 陣列是特殊的物件
由於陣列是特殊的物件,所以陣列也支援物件屬性的解構賦值:
let arr = [1, 2, 3];
let { 0: first, 1: second, 2: last } = arr;
console.log(first); // 1
console.log(second); // 2
console.log(last); // 3
- 字串的解構賦值
字串在進行解構賦值的時候其實是被轉化成為了一個類陣列的物件。
let [a, b, c, d, e] = 'hello';
console.log(a); // h
console.log(b); // e
console.log(c); // l
console.log(d); // l
console.log(e); // o
//因為字串具有length這個屬性,因此我們還可以對該屬性進行解構賦值:
let { length: len } = 'hello';
console.log(len); // 5
- 函式引數的解構賦值
函式的引數也可以進行解構賦值,這是一個解構賦值運用比較多的場景,其實就是對之前所講的陣列、物件、布林值、數值解構賦值的一種實際使用:
let a={name:'小明',age:18}
function wuKongYouLook({name,age}={}){
console.log(name,age)
}
wuKongYouLook(a)//小明,18
wuKongYouLook() //undefined,undefined
//同理,當let {name,age} =null或者undefined時,系統要報錯,但是這時它發現引數有預設值,於是就變成了let {name,age} = {},空物件是可能有name屬性的,那就沒錯,去找找看,沒有,那就返回undefind.