日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五节:一个令人兴奋的ES6新特性:解构赋值

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五节:一个令人兴奋的ES6新特性:解构赋值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????端午節剛剛過,大家是回家陪家人吃粽子,還是約好朋友一起出去浪了?昨天上了一天班,不知道大家有沒有把出去玩耍的心思收回來,準備接下來的學習。

????????繼續學習吧騷年們......

?

????????學完了前4節,今天我給大家帶來的是一個令人興奮的特性:解構賦值。這個章節代碼片段有點偏多,不過可以放心,一點都不燒腦,還是老樣子:簡單易懂。

什么是解構賦值

?

????????按照一貫的套路,接下來的內容是解釋:什么是解構賦值?

?

????????來看看官方的解釋:

ES6允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(Destructuring)。

?

????????這句話也不難理解,但是前端君怎么會這么敷衍了事,隨便貼一段官方的文字解釋就算呢。

?

??????? 來,我們來上一段代碼進一步解釋一下什么叫解構賦值。

關于給變量賦值,傳統的變量賦值是這樣的:

????var arr = [1,2,3];//把數組的值分別賦給下面的變量;
????var a = arr[0];
????var b = arr[1];
????var c = arr[2];

????console.log(a);//a的值為1
????console.log(b);//b的值為2
????console.log(c);//c的值為3

?

????????

????????將數組的元素值1,2,3分別賦值給變量a,b,c,結果也是如我們所愿,賦值成功,這是一種傳統的賦值方式。

????????我們今天要介紹解構賦值會是怎樣的?一起往下看。?

?

變量的解構賦值:

????var [a,b,c] = [1,2,3]; //把數組的值分別賦給下面的變量;
????console.log(a);//a的值為1
????console.log(b);//b的值為2
????console.log(c);//c的值為3

????????

????????注意到了嗎?賦值的代碼大大減少了,不需要分別把變量a,b,c分別聲明定義和賦值,只需要將變量a,b,c作為一個數組的元素,然后將數組[1,2,3]賦值給數組[a,b,c]即可,變量a,b,c即可分別得到對應的值。

?

????????看吧,代碼是不是簡短了很多,可讀性也很強,這種叫做數組的解構賦值。

????????????????????????

數組的解構賦值

????????數組的解構賦值的用法有以下幾情況要注意:

1、結構賦值可以嵌套的

????var [ a,b,[ c1,c2 ] ] = [ 1,2,[ 3.1,3.2 ] ];
????console.log(c1);//結果:c1的值為3.1
????console.log(c2);//結果:c2的值為3.2

????????

????????如我們的預料,數組中即使再嵌套另一個數組,結構賦值也能為我們的變量準確的賦值,c1和c2的值分別為3.1 , 3.2,也就是賦值成功。

2、不完全解構

????var [a,b,c] = [1,2];
????console.log(a);//結果:a的值為1
????console.log(b);//結果:b的值為2

????????

????????當左邊的模式(你可以理解為格式)與右邊不完全一樣的時候,那么賦值過程中,只會給模式匹配成功的部分的變量賦值,例如:變量c沒有在右邊找到匹配的模式,所以無法進行賦值,但這并不影響變量a和變量b的賦值,因為它們在右邊找到與之匹配的模式,這種叫做不完全解構。

3.????賦值不成功,變量的值為undefined


????var [a,b,c] = [1,2];
????console.log(a);//結果:a的值為1
????console.log(b);//結果:b的值為2
????console.log(c);//結果:c的值為undefined

????????

????????還是接著上面的不完全解構例子講解,變量a和變量b為不完全解構,那么變量c解構不成功會怎么樣呢?記住,解構不成功,變量的值就等于undefined。相當于只聲明了變量c,但是沒賦值。

4.????允許設定默認值

????var [a,b,c=3] = [1,2];
????console.log(a);//結果:a的值為1
????console.log(b);//結果:b的值為2
????console.log(c);//結果:c的值為3

????????

????????例子中變量c已經指定默認值為3,即使右側沒有與之對應的值賦給它也沒關系,它都可以成功賦值為3,如果你想覆蓋默認值3,只需賦一個有效的值即可。如下:

????var [a,b,c=3] =[1,2,4];
????console.log(a);//結果:a的值為1
????console.log(b);//結果:b的值為2
????console.log(c);//結果:c的值為4

????????

????????這個時候默認值3會被新的值4覆蓋,c的值為4;注意:當新的值為undefined的時候,是不會覆蓋默認值的。

?

????????以上是數組的解構賦值,除了利用數組可以解構賦值外,用JSON對象也可以。

?

對象的解構賦值?

????????

????????對象的解構賦值跟數組的解構賦值很類似,我們來看一段小代碼:?

????var { a,b,c} = {"a":1,"b":2,"c":3};
????console.log(a);//結果:a的值為1????
????console.log(b);//結果:b的值為2
????console.log(c);//結果:c的值為3

?????????

????????這段例子的代碼是不是跟數組的解構賦值很相似,只不過是數組換成了對象。但是兩者有一個不同的地方,我們對上面的代碼稍做修改:


????var { a,b,c } = {"a":1,"c":3,"b":2};
????console.log(a);//結果:a的值為1
????console.log(b);//結果:b的值為2
????console.log(c);//結果:c的值為3

????????

????????我把右側的對象屬性b和屬性c的位置進行了調換,但這并不會影響賦值的結果,變量b和變量c的值不會改變,依然是b為2,c為3。這就告訴我們對象的解構賦值不會受到屬性的排列次序影響(數組則會受影響),它是跟屬性名關聯起來的,變量名要和屬性名一致,才會成功賦值。

?????

????????如果變量找不到與其名字相同的屬性,就會賦值不成功,如下面的例子:

????var { a } = {"b":2};
????console.log(a);//結果:a的值為undefined

????????

????????變量a在右側找不到與之名字匹配的屬性a,所以變量a賦值不成功,a的值為undefined。

?

????????但也不是完全沒有辦法補救的,如果你想給一個變量名與屬性名不一樣的變量解構賦值,可以這樣寫:

????var { b:a,} = {"b":2};
????console.log(a);//結果:a的值為2

????????

????????這樣變量a同樣可以賦值成功,a的值最終為2。

?

????????對象的解構賦值的用法與數組的解構賦值也很類似:

1、對象解構賦值也可以嵌套

????var {a:{b}} = {"a":{"b":1}};
????console.log(b);//結果:b的值為1

2、可以指定默認值

????var {a,b=2} = {"a":1};
????console.log(b);//結果:b的值為默認值2

字符串的解構賦值

?

????????除了對象和數組可以解構賦值外,字符串也可以這么玩,看看下面的例子:

????var [a,b,c,d,e,f] = "我就是前端君";
????console.log(a);//我
????console.log(b);//就
????console.log(c);//是
????console.log(d);//前
????console.log(e);//端
????console.log(f);//君

????????

????????這是因為在解構賦值的過程中,字符串被轉換成了一個類似數組的對象。變量a,b,c,d,e,f都分別賦上了對應的值。

解構賦值的用途

?

????????介紹了這么多解構賦值的用法,最重要的還是要介紹它的用途。

一、交換變量的值

傳統做法最常用的是引入第三個變量來臨時存放,如下:

????var x = 1;
????var y = 2;
????var z = x;//第三個變量臨時存放x的值
????x = y;? //把y的值賦給x;
????y = z;? //把z的值賦值給y;
????console.log(x); //結果:x為2
????console.log(y); //結果:y為1

????????但是有了解構賦值,想交換兩個變量的值就簡單多了。看下面的代碼:

????var x = 1;
????var y = 2;
????[x,y] = [y,x];

????????簡單的一句代碼即可成功交換x,y的值。

?

二、提取函數返回的多個值

????????函數只能返回一個值,我們可以將多個值裝在一個數組或者對象中,再用解構賦值快速提取其中的值。

????function demo(){
??????? return {"name":"張三","age":21}
????}
????var {name,age} = demo();
????console.log(name);//結果:張三
????console.log(age);//結果:21

????????

????????將demo函數的運行結果直接通過結構賦值賦給變量name和age,實現快速的提取對應的值。

?

三、定義函數參數

????function demo({a,b,c}){
??????? console.log("姓名:"+ a);
??????? console.log("身高:"+ b);
??????? console.log("體重:"+ c);
????}
????demo({a:"張三",b:"1.72m",c:"50kg",d:"8000"});

????????

????????通過這種寫法, 很方便就能提取JSON對象中想要的參數,例如案例中,我們只需要獲取實參中的:a,b,c,而不需要關其他的參數,比如:d或者其他更多的參數。

?

?

四、函數參數的默認值

????????傳統的參數默認值的實現方式是,先判斷該參數是否為undefined,如果是代表沒傳,需要手動給它賦一個值,如:

????function demo(a){
??????? var name;
??????? if(a === undefined){//判斷參數書否是否傳值
?????? name= "張三"; //沒傳,賦默認值
???? }else{
??????????? name= a;
??????? }
??????? console.log(name);
????}

但是有了解構賦值,一切都變得簡單很多!看下面的代碼:

?

????function demo({name="張三"}){
??????? console.log("姓名:"+name);//結果:姓名:張三
????}
????demo({});

????????

????????上面的代碼給我們展示了通過解構賦值設定函數參數的默認值,簡潔地代碼即可實現。函數調用的時候沒有傳入對應的name參數,此時name就會使用默認值:“張三”,是不是很簡潔很方便....

?

????????以上介紹了解構賦值的4個用途,你是不是也感覺到了它給我們帶來的方便,它使我們的代碼量大大的減少,并且語法十分清晰,增加了代碼的可讀性和表現力。

?

????????除了這些用途以外,解構賦值在其他領域都有很好的應用,因為涉及到ES6的其他新知識,就放在在后面的教程再展開講解。

本節總結

?

總結:解構賦值給我們一種新的變量賦值方式,主要可以利用數組解構賦值和對象解構賦值。它的用途包括:交換變量值,提取函數返回值,函數參數定義,默認值設定等等,都給我們編程帶來便利,在未來的代碼中會見到越來越多人使用這個新特性。

總結

以上是生活随笔為你收集整理的第五节:一个令人兴奋的ES6新特性:解构赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。