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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...