詳解JS ES6變量的解構(gòu)賦值
1.什么是解構(gòu)?
ES6允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)。它在語(yǔ)法上比ES5所提供的更加簡(jiǎn)潔、緊湊、清晰。它不僅能減少你的代碼量,還能從根本上改變你的編碼方式。
2.數(shù)組解構(gòu)
以前,為變量賦值,我們只能直接指定值,比如
let a = 1; let b = 2; let c = 3;
現(xiàn)在可以用數(shù)組解構(gòu)的方式來(lái)進(jìn)行賦值
let [a, b, c] = [1, 2, 3]; console.log(a, b, c); // 1, 2, 3
這是數(shù)組解構(gòu)最基本類型的用法,還可以解構(gòu)對(duì)象數(shù)組
// 對(duì)象數(shù)組解構(gòu) let [a, b, c] = [{name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}]; console.log(a, b, c); // {name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}
3.數(shù)組模式和賦值模式統(tǒng)一
這條可以理解為等號(hào)左邊和等號(hào)右邊的形式要統(tǒng)一,如果不統(tǒng)一解構(gòu)將失敗。
let [a, [b, c], d] = [1, [2, 3], 4]; console.log(a, b, c, d); // 1 2 3 4 // 提取除第二、三個(gè)外的所有數(shù)值 let [a, , , d] = [1, 2, 3, 4]; console.log(a, d); //1 4 let [a, ...b] = [1, 2, 3, 4]; console.log(a, b); // 1 [2, 3, 4] let [a, , , ...d] = [1, 2, 3, 4, 5]; console.log(a, d); // 1 [4, 5] 如果解構(gòu)不成功,變量的值就等于undefined let [a, b, c] = [2, 3]; console.log(a, b, c); // 2 3 undefined let [c] = []; console.log(c); // undefined
如果解構(gòu)不成功,變量的值就等于undefined
let [a, b, c] = [2, 3]; console.log(a, b, c); // 2 3 undefined let [c] = []; console.log(c); // undefined
上述是完全解構(gòu)的情況,還有一種是不完全解構(gòu),即等號(hào)左邊的模式,只匹配一部分的等號(hào)右邊的數(shù)組,解構(gòu)依然可以成功。
let [x, y] = [1, 2, 3]; console.log(x, y); // 1 2 let [a, [b], d] = [1, [2, 3], 4]; console.log(a, b, d); // 1 2 4
4.解構(gòu)的默認(rèn)值
解構(gòu)賦值允許指定默認(rèn)值。
let [a, b=2] = [1]; console.log(a, b); // 1 2 let [a=1, b=2, c, d=13] = [10, 11, 12]; console.log(a, b, c, d); // 10 11 12 13
5.對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)與數(shù)組有一個(gè)重要的不同。數(shù)組的元素是按次序排列的,變量的取值由它的位置決定;而對(duì)象的屬性沒(méi)有次序,變量必須與屬性同名,才能取到正確的值。
// 對(duì)象解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對(duì)應(yīng)的變量。真正被賦值的是后者,而非前者。 let obj = { a: "aaa", b: "bbb" }; let { a: x, b: y } = obj; console.log(x, y); // aaa bbb let { a, b } = { a: 'aaa', b: 'bbb' }; console.log(a, b); // aaa bbb // 不按照順序 let { b, a } = { a: 'test1', b: 'test2' } console.log(a, b) // test1 test2 // 嵌套解構(gòu) let { obj: { name }} = { obj: { name: 'jacky', age: '22' } } console.log(name) // jacky // 稍微復(fù)雜的嵌套 let obj = { p: [ 'Hello', { y: 'World' } ] }; let { p: [x, { y }] } = obj; console.log(x, y); // Hello World
如果變量名與屬性名不一致,必須寫成下面這樣。
var { foo: rename } = { foo: "aaa",bar: "bbb" }; console.log(rename); // aaa console.log(foo); // Uncaught ReferenceError: foo is not defined
如果在解構(gòu)之前就定義了變量,這時(shí)候再解構(gòu)會(huì)出現(xiàn)問(wèn)題。下面是錯(cuò)誤的代碼,編譯會(huì)報(bào)錯(cuò)(因?yàn)閖s引擎會(huì)將{a}理解成一個(gè)代碼塊,從而發(fā)生語(yǔ)法錯(cuò)誤。只有不將大括號(hào)寫在行首,避免js將其解釋成代碼塊,才能解決這個(gè)問(wèn)題)
let a; let obj = { a: "aaa" }; {a} = obj; // Uncaught SyntaxError: Unexpected token '='
要解決報(bào)錯(cuò),使程序正常,這時(shí)候只要在解構(gòu)的語(yǔ)句外邊加一個(gè)圓括號(hào)就可以了
let a; let obj = { a: "aaa" }; ( {a} = obj ); console.log(a); // aaa
6.函數(shù)參數(shù)
函數(shù)的參數(shù)也可以使用解構(gòu)賦值。
function add([x, y]){ return x + y; } add([1, 2]); // 3
函數(shù)參數(shù)的解構(gòu)也可以使用默認(rèn)值。
function fn(x, y = 7) { return x + y; } console.log(fn(3)); // 10
7.字符串解構(gòu)
字符串被轉(zhuǎn)換成了一個(gè)類似數(shù)組的對(duì)象。
const [a, b, c, d, e, f] = "hello"; console.log(a); //h console.log(b); //e console.log(c); //l console.log(d); //l console.log(e); //o console.log(f); //undefined
8.數(shù)值和布爾值的解構(gòu)賦值
解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象。
let {toString: s} = 0; console.log(s === Number.prototype.toString); // true let {toString: s} = true; console.log(s === Boolean.prototype.toString); // true
解構(gòu)賦值的規(guī)則是,只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象。由于undefined和null無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)
let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError
9.解構(gòu)賦值的應(yīng)用
1.交換變量的值
通常交換兩個(gè)變量的方法需要一個(gè)額外的臨時(shí)變量,如下
let a = 1; let b = 2; let temp; temp = a; a = b; b = temp; console.log(a, b); // 2 1
用ES6解構(gòu)賦值的話,會(huì)變得很簡(jiǎn)潔
let a = 1; let b = 2; [a, b] = [b ,a]; console.log(a, b); // 2 1
2.從函數(shù)返回多個(gè)值
函數(shù)只能返回一個(gè)值,如果要返回多個(gè)值,只能將它們放在數(shù)組或?qū)ο罄锓祷?。有了解?gòu)賦值,取出這些值就非常方便。
// 返回一個(gè)數(shù)組 function example() { return [1, 2, 3]; } let [a, b, c] = example(); // 返回一個(gè)對(duì)象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();
3.訪問(wèn)數(shù)組中元素
有種場(chǎng)景,比如有一個(gè)數(shù)組(可能為空)。并且希望訪問(wèn)數(shù)組的第一個(gè)、第二個(gè)或第n個(gè)項(xiàng),但如果該項(xiàng)不存在,則使用指定默認(rèn)值。
通常會(huì)使用數(shù)組的length屬性來(lái)判斷
const list = []; let firstItem = 'hello'; if (list.length > 0) { firstItem = list[0]; } console.log(firstItem); // hello
如果用ES6解構(gòu)賦值來(lái)實(shí)現(xiàn)上述邏輯
const list = []; const [firstItem = 'hello'] = list; console.log(firstItem); // 'hello'
4.提取 JSON數(shù)據(jù)
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309]
5.遍歷 Map 結(jié)構(gòu)
任何部署了 Iterator 接口的對(duì)象,都可以用for...of循環(huán)遍歷。Map 結(jié)構(gòu)原生支持 Iterator 接口,配合變量的解構(gòu)賦值,獲取鍵名和鍵值就非常方便。
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for (let [key, value] of map) { console.log(key + " is " + value); } // first is hello // second is world
如果只想獲取鍵名,或者只想獲取鍵值,可以寫成下面這樣。
// 獲取鍵名 for (let [key] of map) { // ... } // 獲取鍵值 for (let [,value] of map) { // ... }
以上就是詳解JS ES6變量的解構(gòu)賦值的詳細(xì)內(nèi)容,更多關(guān)于JS ES6變量解構(gòu)賦值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 解析JavaScript的ES6版本中的解構(gòu)賦值
- JavaScript之解構(gòu)賦值的理解
- Javascript中的解構(gòu)賦值語(yǔ)法詳解
- JavaScript解構(gòu)賦值的5個(gè)常見(jiàn)場(chǎng)景與實(shí)例教程
- Javascript 解構(gòu)賦值詳情
- JavaScript解構(gòu)賦值詳解
- JavaScript解構(gòu)賦值的實(shí)用技巧指南
- 一篇文章帶你了解JavaScript的解構(gòu)賦值
- ES6下javascript解構(gòu)賦值常見(jiàn)用法總結(jié)
- 深入理解JavaScript 解構(gòu)賦值
相關(guān)文章
js實(shí)現(xiàn)簡(jiǎn)單的省市縣三級(jí)聯(lián)動(dòng)效果實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單的省市縣三級(jí)聯(lián)動(dòng)效果,以完整實(shí)例形式分析了JavaScript實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)效果的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-02-02JS 自動(dòng)完成 AutoComplete(Ajax 查詢)
實(shí)現(xiàn)類似于百度或谷歌的搜索下拉列表的,就是打開(kāi)百度往里輸入你要查詢的條件,只要你一輸入他就自動(dòng)彈出一個(gè)下拉列表框,并顯示相關(guān)所有搜索內(nèi)容2009-07-07javascript如何用遞歸寫一個(gè)簡(jiǎn)單的樹(shù)形結(jié)構(gòu)示例
本篇文章主要介紹了javascript如何用遞歸寫一個(gè)簡(jiǎn)單的樹(shù)形結(jié)構(gòu)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09JavaScript talbe表中指定位置插入一行的實(shí)現(xiàn)代碼 腳本之家修正版
用js實(shí)現(xiàn)的在table中指定的位置插入一行,先點(diǎn)一下表中你想插入的位置,點(diǎn)擊即可。2009-06-06使用TypeScript?V8來(lái)改進(jìn)您的JavaScript代碼
TypeScript?V8是一個(gè)強(qiáng)大的JavaScript類型系統(tǒng),它可以幫助你發(fā)現(xiàn)JavaScript代碼中的錯(cuò)誤和潛在問(wèn)題,并在編譯時(shí)捕獲它們,以便您可以解決它們,TypeScript?V8為JavaScript提供一系列的類型注釋,包括自定義類型和其他高級(jí)功能2023-08-08JavaScript基于DOM操作實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)運(yùn)算功能示例
這篇文章主要介紹了JavaScript基于DOM操作實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)運(yùn)算功能,涉及javascript節(jié)點(diǎn)操作、元素遍歷及數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別解析
var可以穿透控制語(yǔ)句、條件語(yǔ)句這樣的作用域,導(dǎo)致變量沖突經(jīng)常發(fā)生,這篇文章主要介紹了ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別,需要的朋友可以參考下2022-09-09JavaScript和HTML DOM的區(qū)別與聯(lián)系及Javascript和DOM的關(guān)系
這篇文章主要介紹了JavaScript和HTML DOM的區(qū)別與聯(lián)系及Javascript和DOM的關(guān)系的相關(guān)資料,需要的朋友可以參考下2015-11-11JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果示例
這篇文章主要介紹了JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果,結(jié)合具體實(shí)例形式分析了js面向?qū)ο蠹夹g(shù)與tab選項(xiàng)卡功能的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02詳解XMLHttpRequest(二)響應(yīng)屬性、二進(jìn)制數(shù)據(jù)、監(jiān)測(cè)上傳下載進(jìn)度
這篇文章主要為大家詳細(xì)介紹了XMLHttpRequest響應(yīng)屬性、二進(jìn)制數(shù)據(jù)、監(jiān)測(cè)上傳下載進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09