[js高手之路] es6系列教程 - 解構詳解

来源:http://www.cnblogs.com/ghostwu/archive/2017/08/08/7305973.html
-Advertisement-
Play Games

解構通俗點說,就是通過一種特定格式,快捷的讀取對象/數組中的數據的方法, es6之前,我們通過對象名稱[鍵] 讀取數據 上面第5行就是一個簡單的數據解構過程: 1,右邊如果是對象,左邊解構的語法也要用對象格式, 如果解構的數據是數組,左邊就用數組格式 2,name, age是局部變數 3,解構出來的 ...


解構通俗點說,就是通過一種特定格式,快捷的讀取對象/數組中的數據的方法,

es6之前,我們通過對象名稱[鍵] 讀取數據

1         var User = {
2             'name' : 'ghostwu',
3             'age' : 22            
4         };
5         console.log( User.name, User.age ); //ghostwu, 22
1         var User = {
2             'name' : 'ghostwu',
3             'age' : 22            
4         };
5         let { name, age } = User;
6         console.log( name, age ); //ghostwu 22

上面第5行就是一個簡單的數據解構過程:

1,右邊如果是對象,左邊解構的語法也要用對象格式, 如果解構的數據是數組,左邊就用數組格式 2,name, age是局部變數 3,解構出來的變數 一定要是 對象中能夠查找到的屬性名 4,如果解構出來的屬性在對象中查找不到,值為undefined
1         var User = {
2             'name' : 'ghostwu',
3             'age' : 22            
4         };
5         let { name1, age1 } = User;
6         console.log( name1, age1 ); //undefined, undefined

解構出來的變數雖然是跟屬性名稱相同,但是他不再是屬性,而是外部的變數,這個變數名也可以被修改, 不一定要跟屬性同名

1         var User = {
2             'name' : 'ghostwu',
3             'age' : 22            
4         };
5         //解構出來的變數可以更改名稱
6         let { name : name1, age : age1 } = User;
7         // console.log( name, age ); //報錯, 因為name和age的名稱已經被改了
8         console.log( name1, age1 ); //ghost, 22

更改解構出來的變數名稱的語法:  舊的名稱 : 新的名稱

1         var User = {
2             'name': 'ghostwu',
3             'age': 22
4         };
5 
6         let { name, age, sex } = User;
7         // 解構出來的屬性,如果不存在,預設值為undefined
8         console.log( name, age, sex ); //ghost 22 undefined
1        var User = {
2             'name': 'ghostwu',
3             'age': 22
4         };
5         // 解構出來的值 可以賦值 一個預設的值
6         let { name, age, sex = 'man' } = User;
7         console.log( name, age, sex );

上述實例,為sex賦值了一個預設值 'man';

解構數組

1         let arr = [ 10, 20, 30, 40 ];
2 
3         // 數組用[]解構
4         let [ one, two ] = arr;
5         console.log( one, two ); //10 20
1 let arr = [ 10, 20, 30, 40 ];
2 // 對於不需要解構的值,可以用逗號占位
3 let [ , , , a ] = arr; 
4 console.log( a ); //40

解構嵌套數組

1         let arr = [ 10, [ 20, 30 ], 40 ];
2         console.log( arr[1][1] ); //30
3         let [ one, two, three, four ] = arr;
4         console.log( one, two, three, four ); //10 [20, 30] 40 undefined
5         [ one, [ two, three ], four ] = arr; //前面不要let,否則會報重定義錯誤
6         console.log( one, two, three, four ); //10 20 30 40

在以前,我們交換變數,一般的做法是藉助第三個變數, 而現在有瞭解構之後,我們可以直接交換

1         /*
2             交換兩個變數的值
3         */
4         let a = 10, b = 20;
5         [ a, b ] = [ b, a ]; //前面不要加let,否則會報 重定義錯誤
6         console.log( a, b ); //20, 10

利用解構出來的值,修改局部變數的值

 1         let User = {
 2             name : 'ghostwu',
 3             age : 22
 4         },
 5         name = 'zhangsan',
 6         age = 30;
 7 
 8         //小括弧: 把下麵這個 轉成解構表達式, 如果不用小括弧會報錯
 9         ({ name, age } = User);
10         console.log( name, age ); //ghostwu, 22
1         let name = 'zhangsan', age = 40;
2         ({ name, age } = {
3             name,
4             age
5         });
6 
7         console.log( name, age ); //zhangsan 40

上述實例,是一個對象賦值的簡寫語法,你還記得嗎?

1         let User = {
2             name : 'ghostwu',
3             age : 22
4         };
5 
6         //重命名局部變數,mySex:賦初始值
7         let { name : myName, age : myAge, sex : mySex = 'man' } = User;
8         console.log( myName, myAge, mySex ); //ghostwu 22 man

解構表達式傳參

 1         let User = {
 2             name : 'ghostwu',
 3             age : 22
 4         };
 5 
 6         function show( obj ){
 7             console.log( obj ); //obj其實就是User對象
 8             console.log( obj === User ); //true
 9             //函數中可以訪問在參數中解構出來的變數
10             console.log( name, age ); //ghostwu, 22
11         } 
12         show( { name, age } = User ); //表達式傳值,整個表達式的值 取決於右邊,所以把User傳給了obj
13         console.log( name, age ); //ghostwu, 22

嵌套對象的解構

 1         let User = {
 2             name : 'ghostwu',
 3             age : 22,
 4             class : {
 5                 group1 : {
 6                     one : '王超',
 7                     two : '馬漢'
 8                 },
 9                 group2 : {
10                     one : '張龍',
11                     two : '趙虎'
12                 }
13             }
14         };
15         //在User對象解構class, 在class中解構group1
16         let { class : { group1 } } = User;
17         console.log( group1.one ); //王超
18         console.log( group1.two ); //馬漢
19 
20         //在User對象解構class, 在class中解構group1, 在group1中解構one, two
21         ({ class : { group1 : { one, two } } } = User);
22         console.log( one, two ); //王超, 馬漢
23 
24         //重命名group1 為 diyizu
25         ({ class : { group1 : diyizu } } = User);
26         console.log( diyizu.one ); //王超
27         console.log( diyizu.two ); //馬漢
28 
29         //three 賦預設值
30         ({ class : { group1 : { one, two, three = '展昭' } } } = User);
31         console.log( one, two, three );//王超,馬漢,展昭

解構中的不定參數(...)

        let arr = [ 10, 20, 30 ];
        let [ one, ...others ] = arr; 
        console.log( others.length ); //2
        console.log( one ); //10
        console.log( others[0] ); //20
        console.log( others[1] ); //30
1         //es6之前,用concat複製數組
2         let arr = [ 10, 20, 30 ];
3         let newArr = arr.concat();
4         console.log( newArr );
1         //用解構與不定參數結合 複製 數組
2         let arr = [ 10, 20, 30 ];
3         let [ ...newArr ] = arr;
4         console.log( newArr );

最後一道綜合練習題: 對象與數組的混合解構,能看懂,基本就算掌握了

 1         let User = {
 2             name : 'ghostwu',
 3             age : 22,
 4             class : {
 5                 group1 : {
 6                     one : '王超',
 7                     two : '馬漢'
 8                 },
 9                 group2 : {
10                     one : '張龍',
11                     two : '趙虎'
12                 }
13             },
14             arr : [ 10, 20, 30 ]
15         };
16 
17         // let { name, age, class : { group1 }, arr } = User;
18         let { name, age, class : { group1, group2 }, arr : [ one, two, three ] } = User;
19         // console.log( name, age, group1.one, group1.two, arr );
20         console.log( name, age, group1.one, group1.two, group2.one, group2.two, one, two, three );

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 同胞擁有相同的父元素。 通過 jQuery,您能夠在 DOM 樹中遍歷元素的同胞元素。 在 DOM 樹中水平遍歷 有許多有用的方法讓我們在 DOM 樹進行水平遍歷: sibllings() next() nextAll() nextUntil() prev() prevAll() preUntil( ...
  • 後代是子、孫、曾孫等等。 通過 jQuery,您能夠向下遍歷 DOM 樹,以查找元素的後代。 向下遍歷 DOM 樹 下麵是兩個用於向下遍歷 DOM 樹的 jQuery 方法: children() find() jQuery children() 方法 children() 方法返回被選元素的所有直 ...
  • CSS中有很多功能強大的方法,其中過渡屬性transition就很牛叉。你不用寫一行JavaScript代碼,隨便寫點css就可以實現一個動畫效果。下麵結合我在W3C網站上看到的實例,舉個慄子說明下(⊙o⊙)… 滑鼠碰我(*^__^*) 上面是一個過渡動畫的demo,效果是不是很帥啊! 額,跑題了( ...
  • stop()函數直接停止動畫,finish()也會停止動畫同時所有排隊的動畫的CSS屬性跳轉到他們的最終值。 示例代碼: 說明: 示例中stop()函數沒有停止動畫,為什麼? ...
  • HTML5新增屬性data 書寫實例 1. 定義: data 屬性用於存儲頁面或應用程式的私有自定義數據。 data 屬性賦予我們在所有 HTML 元素上嵌入自定義 data 屬性的能力。 2. 註意點: data 屬性包括兩部分: 屬性名不應該包含任何大寫字母,並且在首碼 "data " 之後必須 ...
  • 寫這篇博客的目的是讓廣大的學者在初入Vue項目的時候少走些彎路,雖然現在有很多博客也有差不多的內容,但是博主在裡面添加了一些學習時碰到的小問題。在閱讀這篇博客之前,我先給大家推薦一篇文章《入門Webpack,看這篇就夠了》(網址:http://www.jianshu.com/p/42e11515c1 ...
  • 首先,我們通過ajax請求,向後臺傳遞參數,然後後臺經過一系列的運算之後向前臺返還數據,我希望在等待數據成功返還之前可以展示一個loading.gif圖 不廢話,在頁面上執行點擊事件(<a sceneid="@scene.ID" href="javascript:void(0)" onclick=" ...
  • select 獲取select下的所有option 用op=select.options option屬性:op[1].value,op[1].text; //獲取選中項的索引 os.selectedIndex; //獲取當前選中項 select.options[os.selectedIndex]; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...