ES6學習之變數的解構賦值

来源:https://www.cnblogs.com/hongxuquan/archive/2019/01/10/10161721.html
-Advertisement-
Play Games

前言:什麼是ES6?ECMAScript 6(簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。其中相比較於ES5新增了諸多的特性,並且ES6可轉換為ES5的語法。->線上ES6轉換為ES5工具。 本系列學習隨筆參考了阮一峰老師的《ES6標準入門》。 一、解構賦值簡 ...


前言:什麼是ES6?ECMAScript 6(簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。其中相比較於ES5新增了諸多的特性,並且ES6可轉換為ES5的語法。->線上ES6轉換為ES5工具
本系列學習隨筆參考了阮一峰老師的《ES6標準入門》

一、解構賦值簡述

在學習ES6之前,如果我們要從一個數組將值取出來,我們要如何去做?

let arr=[1,2,3];
let a=arr[0];
let b=arr[1];
let c=arr[2];

是不是感覺上面的代碼很繁瑣,我們僅僅是從簡單的數組結構獲取數據就需要很多重覆的代碼,若是更為複雜的數據結構呢,代碼量可能更多,需要遍歷的次數也更多。
針對於這種情況,ES6推出瞭解構賦值,所謂的解構賦值就是允許按照一定模式,從數組和對象中提取值,對變數進行賦值。

二、數組的解構賦值

那我們用ES6的解構賦值可以怎麼去優化簡述中的例子呢?

let [a, b, c] = [1, 2, 3];//表示可以從數組中提取值,按照對應的位置進行一一賦值。

同樣的效果,只需要一行代碼,是不是更清晰與簡潔。 事實上,只要是具有Iterator 介面的都可以解構成功,關於iterable結構請關註我的博客,後續將會介紹,或者也可以去學習阮一峰老師的《ES6標準入門》的 Iterator一章
針對於更複雜的數組結構,也可以進行解析:

let [a, [[b], c]] = [1, [[2], 3]];//a==1,b==2,c==3
let [a,,c]=[1,2,3]//也可以只要其中幾個值a==1,c==3
let [a, ...d] = [1, 2, 3, 4];//可以用...表示這個範圍內解構成一個數組,a==1,d==[2,3,4]
let [a,b,c]=[1,2];//若是解構不成功,值為undefined,a==1,b==2,c==undefined
let [a] = 1;//若是右邊是不可遍歷結構,將會報錯。輸出Uncaught TypeError: 1 is not iterable;
let [a, b, c] = new Set([1, 2, 3]);Set結構也可以解構成功;

解構賦值中允許指定預設值:

let [a,b,c=3]=[1,2];//a==1,b==2,c==3;
//特別註意的是,當一個數組成員嚴格等於undefined,預設值才會生效。
let [a,b=2,c]=[1,null,3];//a==1,b==2,c==3;

預設值可以引用解構賦值的其他變數,但該變數必須已經聲明。

let [a=1,b=a]=[];//a==1,b==1;
let [a=b, b=1] = []; //Uncaught ReferenceError: b is not defined

三、對象的解構賦值

解構賦值不僅可以在數組中使用,對象中也是可以的,但是對象與數組不同的是,數組是按照順序排列的,所以在進行對象解構賦值時,屬性名與變數一定要一樣。
接下來我們看下例子:

let {a,b}={a:1,b:2};//a==1,b==2
//若是想要屬性名與變數名不一樣,我們也可以寫成以下這樣
let { a: b } = { a: 1, c: 2 };//b==1,對象的解構賦值是先去尋找相同的屬性名再去賦值,但是真正賦值的是後者

在對象中也可以像數組一樣進行嵌套賦值

let obj = {
  a: [
    1,
    { c: 2 }
  ]
};
let { a: [b, { c }] } = obj;//b==1,c==2
//此時a是不賦值的,若是a想賦值,可以寫成這樣
let { a, a: [b, { c }] } = obj;//a==[1,{c:2}],b==1,c==2

如果我們要對已經聲明的變數進行解構賦值,要小心js引擎將{}解析成代碼塊:

let a;
{a} = {a: 1};//Uncaught SyntaxError: Unexpected token =
//正確的寫法如下:
({a} = {a: 1})

我們也可以有更為複雜的嵌套賦值:

let obj = {};
let arr = [];
({ b: obj.a, c: arr[0] } = { b: 1, c: 2 });//obj=={b:1},arr==[2]

我們可以引申出很多精妙的用法:

//將Math中的log,sin,cos方法逐一賦值出來。用的時候更方便。  
let { log, sin, cos } = Math;
//操作數組的結構
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;

跟數組一樣,我們在對象的解構賦值也可以進行指定預設值

var {a = 1} = {};//a==1

四、字元串的解構賦值

字元串也可以解構賦值:

const [a,b,c,d]=['fish'];//a=='f';b=='i';c=='s';d=='h';
//還可以解構他的屬性
const [length:len]=['fish'];//len==5

五、函數參數的解構賦值

函數的參數也能解構賦值

function add([x, y]){
  return x + y;
}
add([1, 2]); // 3

上面的例子中,一傳入參數就會自動解構賦值成x1 y2
函數參數的解構賦值也能指定預設值

function add({x = 0, y = 0} = {}) {
  return x+y;
}
add();//0
add(1);//1

六、用途

解構賦值不單單隻能用來純粹的從對象或者數組裡面取值,他還有很多精妙的用途:

let a=1;
let b=2;
[a,b]=[b,a];//此時a==2;b==1;

上面就是一個兩個變數交換值的例子,看更加起來簡潔清晰易於理解。
平時我們函數如果想返回多個變數怎麼辦?我門可以將他們先轉成數組或者對象,然後再解構賦值:

function getArry(){
	return [1,2,3];
} 
let [a,b,c]=getArry();//a==1;b==2;c==3

利用解構賦值我們也可以將函數的多個參數一一對應起來;

function a([a,b,c]){};
a([1,2,3]);
//還可以設置函數參數的預設值,上文已提過,這裡就不重覆說明瞭。

我們也可以利用解構賦值用來提取json裡面的值;

let json={
	data:[1,2,3]
}
const [data: num]=json;//num==[1,2,3]

總之,變數的解構賦值是ES6新增的一種使代碼更加優美簡潔的一種模式,有興趣的同學可以多去使用學習。


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

-Advertisement-
Play Games
更多相關文章
  • MongoDB介紹 MongoDB是一個基於分散式文件存儲的開源文檔資料庫。由C++語言編寫。旨在為WEB應用提供高性能、高可用性和高伸縮數據存儲解決方案。 MongoDB優點 MongoDB使用場景 數據緩存 由於性能很高,MongoDB適合作為信息基礎設施的緩存層。在系統重啟之後,由MongoD ...
  • 一、oc代碼 提示:看本文章之前,最好按順序來看; //代碼 //列印 分析: 1)三個block的類型分別為:__NSGlobalBlock__、__NSMallocBlock__、__NSStackBlock__,什麼原因,往下看; 2)上述三種類型最終都是繼承自NSBlock,而NSBlock ...
  • 本文用來介紹 iOS 多線程中 GCD 的相關知識以及使用方法。這大概是史上最詳細、清晰的關於 GCD 的詳細講解+總結的文章了。通過本文,您將瞭解到: 1. GCD 簡介 2. GCD 任務和隊列 3. GCD 的使用步驟 4. GCD 的基本使用(6種不同組合區別) 5. GCD 線程間的通信 ...
  • 一,效果圖。 二,代碼。 參考資料:《菜鳥教程》 ...
  • h1{ /*文字陰影*/ font-size: 100px; text-shadow: 10px 3px 3px rgba(0,0,0,.5) ; } div{ /*盒子陰影*/ width: 200px; height: 200px; border: 10px solid #cccccc; /*b ...
  • 首先來解釋一下啥是事件冒泡現象 事件冒泡: 多個元素嵌套,有層次關係,這些元素都註冊了相同的事件,如果裡面的元素的出發了事件,外面的元素該事件也觸發 在這裡有必要強調一下 相同的事件 不一定完全相同 即 都是 點擊事件 或者 都是 滑鼠移入事件 來個例子 先寫出來這三個div的結構 再給他們寫好樣式 ...
  • 1.module、export、import是什麼,有什麼作用? 2.日常前端代碼開發中,有哪些值得用ES6去改進的編程優化或者規範? 3.請你談談Cookie的弊端? 4.git fetch和git pull的區別? 5.svn與git的區別? ...
  • 前言:講起前端,我們就不能不講CSS與Javascript,在這兩種技術廣泛應用的今天,他們的擴展也是層出不窮,css的擴展有Less、Sass、Stylus 等,js的超集有Typescript等。今天我們就簡單來聊聊Less與Typescript以及靜態模塊打包器webpack。 本節目標:本文 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...