ES6學習筆記之變數的解構賦值

来源:http://www.cnblogs.com/Gary-Guoweihan/archive/2016/08/30/5822937.html
-Advertisement-
Play Games

es5中通常我們聲明變數都是以下的方式: 有時變數多寫起來真的很麻煩,很多繁瑣的差不多的重覆工作,es6為我們提供了多種更加便利的聲明變數的形式——變數的解構賦值 es6允許按照一定的模式,從數組和對象中提取值,對變數進行賦值。本質是模式匹配。 變數的聲明和賦值是一體的,使用let或者const不可 ...


es5中通常我們聲明變數都是以下的方式:

 1 var a = 10;
 2 var b = 20;
 3 var c = 30;
 4 
 5 //或者
 6 
 7 var a = 10,b = 20,c = 30;
 8 
 9 //或者
10 
11 var arr = [1,2,3,4,5];
12 var a = arr[0];
13 var b = arr[1];
14 var c = arr[3];
15 
16 //或者
17 
18 var obj = {
19   name: 'gary',
20   age: 20
21 }
22 
23 var a = obj.name;
24 var b = obj.age;
25 
26 //或者
27 
28 //等等

有時變數多寫起來真的很麻煩,很多繁瑣的差不多的重覆工作,es6為我們提供了多種更加便利的聲明變數的形式——變數的解構賦值

es6允許按照一定的模式,從數組和對象中提取值,對變數進行賦值。本質是模式匹配。

變數的聲明和賦值是一體的,使用let或者const不可以重覆定義

數組的解構賦值

數組的解構賦值需要左邊的變數結構需要等於右邊的值的結構,即給對應位置的變數聲明對應位置的值,變數的取值由位置決定

只要某種數據類型具有迭代器(iterator)介面,就可以使用數組的解構賦值,不一定非是數組

es6中具有iterator介面的數據類型有:數組,類數組對象,字元串,Set,Map,Generator函數

註:對象不具有iterator介面,需要自己配置

 1 var [a,b,c] = ['a','b'];
 2 console.log(a); //a
 3 console.log(b); //b
 4 
 5 var [a,[[b],c]] = [1,[[2],3]];
 6 console.log(a); //1
 7 console.log(b); //2
 8 console.log(c); //3
 9 
10 //不完全解構,左邊只是右邊的一部分,但是模式是正確的
11 var [a,,c] = ['a1','b1','c1','d1'];
12 console.log(a); //a1
13 console.log(c); //c1
14 
15 var [a,...b] = ['a2','b2','c2','d2']; 
16 //rest參數:...b 獲取多餘的數組元素,組成一個新數組,常用於函數參數中,作用與arguments類似,arguments是類數組
17 console.log(a); //a2
18 console.log(b); //['b2','c2','d2']
19 
20 var [a,b,...c] = ['a3'];
21 //rest參數必須是最後一個元素
22 console.log(a); //a3
23 console.log(b); //undefined 解構不成功就是undefined
24 console.log(c); //[] rest參數解構不成功是空數組[]
25 
26 //字元串具有iterator介面
27 var [a,b,c] = 'hello';
28 console.log(a); //h
29 console.log(b); //e
30 console.log(c); //l
31 
32 var [a,b,c] = new Set(['aa','bb','cc']);
33 console.log(a); //aa
34 console.log(b); //bb
35 console.log(c); //cc

對象的解構賦值

對象的屬性沒有次序,變數必須與屬性同名,才能取到正確的值,即變數名與屬性名一一對應,次序不重要

 1 var {foo,bar} = {bar: 'aaa', foo: 'bbb'}
 2 console.log(foo); //bbb
 3 console.log(bar); //aaa
 4 
 5 var {foo} = {baz: 'ccc'}
 6 console.log(foo); //undefined 因為變數與屬性名不一致
 7 //解決辦法
 8 //在變數前指定對應的屬性名使用:隔開
 9 var {baz:foo} = {baz: 'ddd'}
10 console.log(foo); //ddd  foo指向baz屬性對應的值
11 
12 //還可以用於嵌套結構對象, 不過應該很少會這麼做吧。。。
13 var obj = {
14   p: [
15     'Gary',
16     {
17       y: 'Guo'
18     }
19   ]
20 }
21 
22 var {
23   p: [
24     x,
25     {
26       y
27     }
28   ]
29 } = obj;
30 
31 console.log(x); //Gary
32 console.log(y); //Guo

如果是先聲明瞭變數再進行對象解構賦值則需要加上括弧,否則js回你認為{}是一個代碼塊,而不是解構賦值

1 var bar;
2 {bar} = {bar:1} //SyntaxError: expected expression, got '='
3 console.log(bar);
4 
5 var bar;
6 ({bar} = {bar:111})
7 console.log(bar);  //111 實際開發中不推薦這麼做

對象解構賦值的小應用:求最大值

 1 //正常方法
 2 var arr = [2,5,1,8,4,2];
 3 console.log(Math.max.apply(this, arr)); //8
 4 
 5 //簡化
 6 
 7 var {max} = Math;
 8 console.log(max.apply(this, arr)); //8
 9 
10 即是將現有方法賦值到變數上使用

函數參數的解構賦值

結合數組和對象的解構賦值,進行函數參數的解構賦值

 1 function f([x,y]){
 2   return x+y;
 3 }
 4 
 5 f([1,2]); //3
 6 
 7 function d({name = 'g',age = '2'} = {}){ //undefined會觸發預設值
 8   return `${name} ${age}`; //此處相當於name+' '+age
 9 }
10 
11 d({name: 'Gary',age: '20'}); //Gary 20

預設值

當變數的值嚴格等於(===)undefined時預設值會生效

數組解構預設值設置:

 1 var [a=1, b=2] = [,4];
 2 console.log(a); //1 預設值
 3 console.log(b); //4
 4 
 5 var [a = 1, b = 2] = [4, undefined];
 6 var [i = 10, s = 20] = [5,null];
 7 console.log(a); //4
 8 console.log(b); //2  預設值
 9 console.log(i); //5
10 console.log(s); //null  null !== undefined
11 
12 //如果預設值是表達式,那麼會進行惰性求值,即用到才會進行計算,用不到就不理它
13 function f(){
14   return 'Gary';
15 }
16 var [a = f()] = [2];
17 console.log(a) //2 f()不會執行

對象解構預設值設置:

在變數後面使用=進行預設值的賦值 var {foo = 預設值} = {}

1 var {foo = 3} = {}
2 console.log(foo); //3
3 
4 var {baz:foo = 3} = {baz: null}
5 console.log(foo); //null
6 
7 var {baz:foo = 5} = {baz: undefined}
8 console.log(foo); //5

用途:

1. 交換變數的值

 1 //正常
 2 var a = 10;
 3 var b = 20;
 4 var c;
 5 c = a;
 6 a = b;
 7 b = c;
 8 
 9 console.log(a); //20
10 console.log(b); //10
11 
12 //使用解構賦值
13 
14 var x = 10;
15 var y = 20;
16 
17 [x,y] = [y,x];
18 console.log(x); //20
19 console.log(y); //10

2. 從函數返回多個值

3. 函數參數的定義

函數的參數如果是對象的成員,優先使用解構賦值

4. 提取JSON數據

5. 函數參數的預設值

在參數中指定預設值

避免 var a = obj || {}的語句

6. 遍歷Map解構

7. 輸入模塊的指定方法

 


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

-Advertisement-
Play Games
更多相關文章
  • 概念 響應式佈局,就是響應式設計方案的呈現。具體點就是在不同的設備上,網頁能自動識別屏幕寬度、並根據設備的顯示面積(一般情況下是指的屏幕寬度,當然,也可以是其他的,可以在下麵詳細解釋)顯示出不同的效果。通俗點就是設計一套佈局,在PC端和移動端都可以使用。 如何實現響應式佈局? 通俗的有三種方法 1、 ...
  • 響應式佈局,就是一個網站可以相容多類型終端,但不是需要為每一個終端做一個特定的網頁版本。響應式佈局可以為不同終端的用戶提供更舒適的界面和用戶體驗,目前越來越多的大屏幕移動設備的出現,響應式也隨之成為開發人員廣泛使用的WEB技術。 優點: 面對不同解析度設備靈活性強 能夠快捷解決多設備顯示適應問題 缺 ...
  • 使用vue編寫一個點擊數字計時小游戲,列入你在文本框中輸入3,點擊開始會生成一個3行3列的表格,表格數據為1-9隨機排列,這時候從1開始點擊,按順序點到9,當按正確順序點擊完畢,會提示所用的時間,如果順序沒有按對,會提示游戲結束. 1.首先下載vue源碼,下載地址http://cn.vuejs.or ...
  • 本文以實例形式詳細講述了jQuery動畫特效的實現方法。 1.自製摺疊內容塊 內容塊如下: <div class="module"> <div class="caption"> <span>標題</span> <img src="rollup.gif" alt="rollup" title="rol ...
  • 說到響應式佈局,相信大家都有一定的瞭解,響應式佈局是今年很流行的一個設計理念,隨著移動互聯網的盛行,為解決如今各式各樣的瀏覽器解析度以及不同移動 設備的顯示效果,設計師提出了響應式佈局的設計方案。今天就和大家來講講響應式佈局這件小事,包含什麼是響應式佈局、響應式佈局的優點和缺點以及響應式布 局該怎麼 ...
  • 一、什麼是"非構造函數"的繼承? 比如,現在有一個對象,叫做"中國人"。 還有一個對象,叫做"醫生"。 請問怎樣才能讓"醫生"去繼承"中國人",也就是說,我怎樣才能生成一個"中國醫生"的對象? 這裡要註意,這兩個對象都是普通對象,不是構造函數,無法使用構造函數方法實現"繼承"。 object()方法 ...
  • 一,JavaScript If...Else 語句 條件語句 通常在寫代碼時,您總是需要為不同的決定來執行不同的動作。您可以在代碼中使用條件語句來完成該任務。 在 JavaScript 中,我們可使用以下條件語句: if 語句 - 只有當指定條件為 true 時,使用該語句來執行代碼 if...el ...
  • 移動前端開發,也就是webapp,主要是針對Iphone、Android等高端手機。 1、禁止用戶屏幕旋轉。 這點可以肯定的說是做不到的,之前因為有項目需要禁止屏幕旋轉,所以網上查閱了大量的資料,發現根本沒有解決辦法,在移動版webkit中根本做不到。蘋果api也說明瞭,我們為了讓用戶在safa... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...