ES6-變數的解構賦值複習+學習
ES6——變數的解構賦值
由於之前學過ES6的解構賦值,但是只是略看了一點網上的影片,所以今天就看了看ES6對這一部分的詳細介紹,然後做一個總結的筆記。
首先,先大概說一下什麼是變數的解構賦值,大概了解一下是什麼?然後從幾個方面分別對這個概念,以及相應的知識做一個總結和學習,最後總結一下具體的用途,然後再看一下涉及到的不足,以及解決方法!具體分為以下幾點:
1.基本用法(模式匹配),同時藉此理解什麼是變數賦值
2.對象的解構賦值
4.數值和布爾值的解構賦值
5.函數參數的解構賦值
6.重要的用途都有哪些
7.涉及到的括弧問題
接下來就從上面這七點展開複習和學習!
1.基本用法(模式匹配),同時藉此理解什麼是變數賦值
1 //1.首先,什麼是解構賦值? 2 //在ES6中,允許按照一定的模式從數組和對象中提取值,然後對變數進行賦值,這個被稱為解構賦值,舉個例子: 3 let a = 1; 4 let b = 2; //普通的變數聲明 5 let [a,b] = [1,2]; //利用解構賦值進行的變數聲明(該方法為「模式匹配」) 6 //至此我想大家都應該知道解構賦值的大概意思了吧! 7 //利用模式匹配的方法對數組進行解構: 8 let [a,[b,c]] = [1,[2,3]]; //簡單理解就是對應變數對應的值 9 10 11 //2.模式匹配的三種情況:解構成功,解構不成功,不完全解構,以及模式匹配的條件。如下: 12 //(1)解構成功就是對應都有值,這個就不再多說 13 //(2)解構不成功,則變數的值就是undefined,例如: 14 let [f] = []; 15 let [a,f] =[1]; //這兩個都是解構不成功,對應的f就是undefined 16 //(3)不完全解構,意思應該是數值較多,變數少的情況。例如: 17 let [a,b,c] = [1,2,3,4]; //這裡右邊有四個數值,左邊有三個變數,那就是從左向右對應賦值,解構可以成功,但是不完全。 18 //(4)模式匹配的條件:如果等號右邊不是可遍歷的解構,那麼將會報錯。例如: 19 let [f] = 2; 20 let [f] = false; 21 let f = NaN; //這幾個都會報錯,原因就是等號右邊的值轉為對象後不具備Iterator介面,或者就是本身就沒有這個介面 22 let f = undefined; 23 //只要有Iterator介面,或者是Generator函數,也都可以進行解構賦值,例如: 24 function *fibs(){ 25 let a = 0; 26 let b = 1; 27 while(true){ 28 yield a; 29 [a,b] = [b,a+b]; 30 } 31 } 32 let [a,b,c,d,e,f] = fibs(); //f = 5; 33 //當然Iterator,Generator是什麼?大家可以先搜索一下了解一下,在之後我會就這部分單獨進行學習和複習,以及做筆記。 34 35 36 //3.默認值 37 //(1)解構賦值可以做默認值,那麼默認值是幹什麼的?是什麼?看以下例子你就知道了: 38 let [f = 1] = []; //f的值是1 39 let [x = 1] = [undefined] // x的值是1 40 let [x = 1] = [null] //x的值是null,這種情況和上面的不同,為什麼呢? 41 //大家看完上面的例子為什麼最後一個是null?看第(2)點。 42 //(2)注意一個默認值規則:ES6內部的默認值是先進行===判斷,然後再讓默認值生效的。 43 let [x = 1] = [null] //當執行這一句,會先判斷等號右邊括弧內是否是undefined,此時右邊是null與undefined不一樣,所以默認值不會生效,結果就是null 44 let [x = 1] = []; //等號右邊是空,空也就是undefined,所以默認值可以生效,所以x=1成立 45 //(3)默認值的方式 46 //默認值可以是變數: 47 let [x =1,y = x]= []; // x=1;y=1; 48 let []x = 1,y=x] =[2]; //x = 2,y = 2; 先進行===比較,如果右邊有值,先賦值,如果沒了,取默認值 49 //默認值可以表達式,而表達式是惰性的,在用時才會執行: 50 function(){ 51 console.log('aaa'); 52 } 53 let [x = f()] = [1]; //在該程式碼中,等號右邊數組裡面有值,則x可以取到值,因此不需要默認值,那麼f()這個表達式根本不會執行。 54 55 //注意:數組的模式是成員,而不是成員的值,兩回事,在最後的圓括弧內會提及
2.對象的解構賦值
1 //1.對象解構的規則(與數組解構的區別) 2 //(1)對象解構與數組解構不同,對象解構是匹配屬性名的,而不看順序: 3 let {b,f} = {f:"f",b:"b"}; //得到的結果b為b,f為f 4 //(2)對象解構是屬性找不到匹配值會得到undefined 5 //(3)對象的匹配模式,不同變數名的解構賦值操作: 6 let{匹配已有屬性名:真正想要改變值的屬性名} = {匹配已有的屬性名:對應的屬性值}; 7 let{f:f} = {f:"fff"}; //對象的匹配模式是等號左邊的f屬性的值是個f變數,這樣匹配到的f屬性的值才是fff 8 let{f:a} = {f:"fff"}; //對象中含有屬性a,但是等號右邊沒有屬性a,此時怎麼對屬性a賦值呢?利用f屬性:對應屬性就可以讓a得到fff 9 let{foo:bar} = {foo:"barbarbar"} //結果就讓bar得到了barbarbar字元串 10 //在上面的程式碼中,foo與f是匹配的模式,f,a,bar才是變數,才是真正被賦值的,而不是匹配模式 11 //(4)匹配模式的嵌套理解: 12 var demo = { 13 a:{ 14 b:{ 15 c=1 16 } 17 } 18 } 19 var {a,a:{b},a:{b:{c}}} = demo; //c:1,b為{c=1},a為{b:obj},該匹配等號左邊的a相當於 a:a的形式 20 21 22 //2.對象解構的默認值 23 //對象解構也可以有默認值,默認值的條件仍舊是等號右邊對象屬性判斷為undefined 24 var {x = 3} ={} //x = 3 25 var {x:y = 3}={} //匹配模式x為匹配名字,對應得還是y得值改變,此時等號右邊為undefined,y取默認值 26 var {x:x = 3} = {x:null} //仍舊為null 27 28 29 //3.對象解構與數組解構 30 //因為數組得本質也是對象,因此可以讓對象與數組相互使用: 31 let arr = [1,2,3]; 32 let{0:a,1:b,2:c} = arr; //a=1,b=2,c=3 此時就很類似偽數組 33
3.字元串的解構賦值
1 //字元串也可以解構賦值,此時就轉化為一個偽數組形式 2 const [a,b,c]="big"; //a為b,b為i,c為g 3 //偽數組(對象)也有一個length屬性 4 let {length:len} = "hello"; //len = 5; 5 //創建一個偽數組對象類似於下列: 6 var ar={ 7 0:'1', 8 1:'2', 9 length:2 10 }
4.數值和布爾值的解構賦值
1 //等號右邊是數值或者布爾值,則會先轉化為對象,而undefined,或者null無法轉化為對象,因此肯定會報錯: 2 let {toString:a} = 1; 3 let {toString:a} = true; 4 //a都可以取到一個Number,一個Boolean , 因為數值和布爾值對象裡面都含有toString方法,含有就可以用
5.函數參數的解構賦值
1 //函數得參數可以解構賦值 2 function add([x,y]){ 3 return x+y; 4 } 5 add([1,2]) //3,其中[1,2]與形參[x,y]就相當於一個解構賦值 [x,y]=[1,2]; 6 //函數參數解構可以有默認值,下面介紹兩種不同形式 7 function x({x=0,y=0}={}){ 8 return [x,y]; 9 } 10 x({x:1,y:2}); //[1,2] 第一種參數 11 x({}); //[0,0] 第二種參數 12 x(); //[0,0] 第三種參數 13 //以上為第一種情況,當參數種等號右邊傳進去得值為第一種得時候,判斷對象為非undefined則執行賦值,當傳入的是第二種參數時,判斷對象為undefined,此時就會有默認值x = 0, y = 0; 14 function({x,y}={x:0,y:0}){ 15 return [x,y]; 16 } 17 x({x:3,y:8}); //[3,8] 18 x({}) //[undefined,undefined]; 當傳入為undefined, 19 //綜上所屬,實際上時函數參數來得到默認值,而不是變數x,y。當有undefined時會觸發默認值
6.重要的用途都有哪些
1 //1.交換變數的值 2 let x = 1; 3 let y = 2; 4 [x,y] = [y,x]; 5 //2.從函數返回多值 6 function sss(){ 7 return [1,2,3]; 8 } 9 let [a,b,c] =sss(); //當然也可以返回一個對象, 10 //3.函數參數定義,這個就不多說了 11 //4.提取JSON數據 12 let jsonDate = { 13 id:1, 14 status:'OK', 15 data:[888,888] 16 } 17 let {id,status,number} = jsonData; 18 //5.函數參數的默認值 19 //6.遍歷Map解構 20 //任何部署了Iterator介面的對象都可以用for...of循環遍歷。Map解構原生支援Iterator介面,配和變數值取值就很方便 21 var map = new Map(); 22 map.set('a','b'); 23 24 for(let [key,value] of map){ 25 console.log(key + "is" + value); 26 } 27 //該部分如果涉及到那些不了解的部分可以先自行查閱,後面我也會一一學習map與Iter介面。 28 //7.輸入模組的指定方法 29 const{SourceMapConsumer,SourceNode} = require("source-map"); 30 //以上基本都是有數組,值傳遞的點,這些點注意可以使用解構賦值,會更加的方便,在學習複習後面的知識的時候,都會穿插舉例子,越學越明白
7.涉及到的括弧問題
1 //這裡就涉及到解構賦值的問題了,解構賦值雖然很方便,但是解析起來並不是很容易,對於具體的種類需要遇到等號的時候才可以得到答案,出現[],{}都可以理解,但是出現了()又怎麼辦呢?ES6的解釋就是,那就別用()了,哈哈,有問題,就跳過問題,不就沒問題了?我直呼好傢夥!當然肯定盡量不使用()。 2 //1.不能使用()的情況 3 //(1)變數的聲明 4 let [(a)] = [1]; //肯定報錯 5 let {x:(c)} = {} //報錯 6 let {(x):c} = {} //報錯 7 let (o:({p:p}))={o:{p:2}}; //報錯 8 //聲明變數絕對不可以用() 9 //(2)函數的參數,也屬於變數聲明肯定不可以加(),這裡就不舉例子了,把上面的等號左邊的變數或者對象直接放到函數小括弧內就是了 10 //(3)賦值語句 11 ({p:a}) = {p:42}; //報錯 12 ({p:(d)}) = [5]; //報錯 13 [({p:a}),{x:c}] = [{},{}]; //報錯 14 //把程式碼模式放到括弧里,把一部分放到括弧里都會導致報錯 15 16 //2.可以使用的情況 17 //只有一種賦值語句非模式部分可以使用() 18 [(b)] = [3]; //第一種數組 19 ({p:(d)}) ={}) //非模式部分可以使用括弧 20 //首先,可以使用的原因,都是賦值語句,不是聲明語句,括弧里都不屬於模式的一部分,第一種數組的模式是b值對應的數組的第一個成員,而括弧里的是數組第一個成員對應的值。
今天的學習,就到這裡,大家可能看到有些東西在哪裡見過,當然我也不是無敵的,我自己原創一個內容,我肯定也是學習別人的知識,然後自己做個筆記方便日後複習,同時記錄一下今天的學習內容,一天一點進步,一大堆的文字,沒有什麼圖片,不精彩啊。但是,知識的學習就是這樣,你想搞懂這個情況,肯定要閱讀大量的文字,這也是一個過程,當你真正的體會到理解到知識的時候,就也有一種成就感吧,小小的喜悅。當然,我一個字一個字寫了這麼多,總結了記下了這些筆記,雖然在別人眼裡可能很簡單,沒必要,但是一步一步我也會涉及到深層知識,就想Vue一樣,漸進式的由淺入深,加油吧少年,奧里給!!!