ES6入門教程之變量的解構(gòu)賦值詳解
前言
我們經(jīng)常定義許多對(duì)象和數(shù)組,然后有組織地從中提取相關(guān)的信息片段。在ES6中添加了可以簡(jiǎn)化這種任務(wù)的新特性:解構(gòu)。解構(gòu)是一種打破數(shù)據(jù)結(jié)構(gòu),將其拆分為更小部分的過程。本文將詳細(xì)介紹ES6解構(gòu)賦值,下面話不多說了,來一起看看詳細(xì)的介紹吧
數(shù)組的解構(gòu)賦值
基本用法
ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為結(jié)構(gòu)。
在ES6之前想要為變量賦值,只能指定其值,如下:
let a = 1; let b = 2
而在ES6中可以寫成這樣,如下:
let [a,b] = [1,2] // a = 1, b = 2
值得注意的是,等式兩邊的值要對(duì)等,這樣左邊的變量才會(huì)被賦上右邊對(duì)應(yīng)的值,如果不對(duì)等左邊的值將會(huì)出現(xiàn)undefined,如下寫法:
let [foo,[[bar],baz]] = [1,[[2],3]] foo // 1 bar // 2 baz // 3
注意:只有左右兩邊的 格式一定要對(duì)等,數(shù)量可以不對(duì)等。
let [a,b,c] = [1,2] a = 1, b = 2, c = undefined let [a,,c] = [1,2,3] a = 1, c = 3 let [a, ...b] = [1,2,3] a = 1, b = [2,3] let [a] = [] let [b,a] = [1] a = undefined
還有一種情況,等號(hào)左邊為數(shù)組,但是等號(hào)右邊為其他值,將會(huì)報(bào)錯(cuò)。如下:
let [a] = 1;
let [a] = false;
let [a] = NaN;
let [a] = undefined;
let [a] = null;
let [a] = {};
以上都會(huì)報(bào)錯(cuò)
但是如果左邊為數(shù)組,右邊為字符串,將會(huì)取字符串的第一個(gè)下標(biāo)的值
let [a] = '121321' a = '1' let [a] = 'adgasg' a = 'a'
對(duì)于Set結(jié)構(gòu),同樣可以使用數(shù)組的解構(gòu)賦值。
let [x,y,z] = new Set([1,2,3]) x = 1, y = 2, z = 3
默認(rèn)值
解構(gòu)賦值允許指定默認(rèn)值
let [a = 3] = [] // a:3 let [a = 3,b] = [,4] // a:3 b:4 let [a = 3,b] = [5,4] // a:5 b:4
特殊
let [a = 3] = [undefined] // a:3 let [a = 3] = [null] // a:null
Tips: 在es6中使用嚴(yán)格相等運(yùn)算符,在結(jié)構(gòu)賦值中如果需要默認(rèn)值生效,則應(yīng)對(duì)等的值為undefined的時(shí)候才會(huì)采用默認(rèn)值,否則還是使用賦值。上面中null 不嚴(yán)格等于undefined++
如果默認(rèn)值的賦值為一個(gè)表達(dá)式,只有當(dāng)?shù)忍?hào)右邊的賦值沒有值為undefined的時(shí)候,才會(huì)取表達(dá)式中的值,如下:
function demo(){
console.log('demo')
}
let [a = demo()] = [] // a: demo
let [a = demo()] = [1] // a : 1
對(duì)象的解構(gòu)賦值
與數(shù)組的不同點(diǎn)是,數(shù)組的元素必須和賦值的元素要位置一致才能正確的賦值,而對(duì)象的解構(gòu)賦值則是等號(hào)兩邊的變量和屬性同名即可取到正確的值。否則值為 undefined
let {a,b} = {a:'23',b:'3'}
let {a,b} = {b:'3',a:'23'}
// 上面兩個(gè)的值 都是 a: 23 b: 3
let {a,b} = {a:'3',c:'d'}
//a: 3 b: undefined
對(duì)象的解構(gòu)賦值還有將某一個(gè)現(xiàn)有對(duì)象的方法賦值到一個(gè)新的變量,如下:
let {sin,cos} = Math
// Math 中的sin cos 方法將賦值給變量 sin cos
let {log} = console
// log(2) === console.log(2)
如果等號(hào)左邊的變量名不能和等號(hào)右邊的對(duì)象的屬性名一致,則必須寫成如下格式:
let {a:b} = {a:'ss'} // b:ss
//a是屬性名,b才是實(shí)際賦值的變量名
對(duì)象的解構(gòu)賦值一樣是可以嵌套解構(gòu)的,如下:
第一種:
let obj = {
p:[
'Hello',
{y:'world'}
]
}
let {p:[x,{y}]} = obj
// x: Hello, y: world
這邊的p只是屬性不是變量,如果p想賦值可以寫成:
let {p,:[x,{y}]} = obj
第二種:
const a = {
loc: {
t :1,
b :{
c:1,
d:2
}
}
}
let {loc:{t,b:{c,d}}} = a
或者
let {loc,loc:{t,b,b:{c,d}}} = a
嵌套賦值
let o = {}, arr = []
({foo:o.prop,bar: arr[0]} = {foo:123,bar:true})
//o: 123, arr = [true]
如果解構(gòu)模式 是嵌套的對(duì)象,如果子對(duì)象所在的父屬性不存在,則會(huì)報(bào)錯(cuò),如下:
let {foo:{bar}} = {baz:'baz'} //報(bào)錯(cuò)
默認(rèn)值
let {x = 3} = {}
// x: 3
let {x,y = 5} = {x : 1}
// x: 1, y: 5
let {x: y = 5} = {}
// y = 5
let {x: y = 5} = {x : 4}
// y = 4
let {x: y = 'hhhh'} = {}
//y = 'hhhh'
Tips:以上左邊 x為屬性名,y為變量
let {x = 5} = {x: undefined}
// x: 5
let {x = 4} = {x: null}
// x: null
同數(shù)組一樣遵循 嚴(yán)格等于
只有右邊為undefined的時(shí)候默認(rèn)值才會(huì)生效
注意點(diǎn):
1)不能將已聲明的變量用于解構(gòu)賦值,因?yàn)橐呀?jīng)是一個(gè)代碼塊。
字符串的解構(gòu)賦值
如果賦值的對(duì)象是數(shù)組,字符串將被分割為數(shù)組的格式,一一對(duì)應(yīng)賦值
let [a,b] = 'ha'
// a = h , b = a
同時(shí)可以獲得字符串的長度:
let {length:len} = '12121'
// len = 5
數(shù)值和布爾值的解構(gòu)賦值
如果等號(hào)右邊是數(shù)字或者布爾值 則轉(zhuǎn)換成對(duì)象或者說,除了是數(shù)組和對(duì)象,其他值都將轉(zhuǎn)換成對(duì)象,null 和 undefined 除外。如下:
let {t:s} = 123
let {t: s} = true
函數(shù)參數(shù)的解構(gòu)賦值
function add([x,y]){
return x+y
}
add([3,5]) // 8
[[3,5],[6,7]].map(([a,b]) => a + b)
//8 , 13
function m({x=3, y=4} = {}){
return [x,y]
}
m({x:33,y:8}) // [33,8]
m({x:32}) // [32,4]
m({}) // [3,4]
m() // [3,4]
function m({x,y} = {x=0,y=0}){
return [x,y]
}
m({x:33,y:8}) // [33,8]
// 代替右邊的 x:0, y:0 所以是傳值 33 8
m({x:32}) // [32,undefined]
//因?yàn)閭髦堤娲疫叺馁x值,但是只有x沒有y
//所以y是取 左邊y的默認(rèn)值,因?yàn)槟銢]有賦值 為undefined
m({}) // [undefined,undefined]
// 取左邊x,y的默認(rèn)值,因?yàn)闆]有賦值 為undefined
m() // [0,0]
// 沒有傳值,使用本身的賦值 都是0
其他
不能使用圓括號(hào)的情況
- 變量聲明語句
- 函數(shù)參數(shù)
- 賦值語句的模式
可以使用圓括號(hào)的情況
- 賦值語句的非模式部分,可以使用圓括號(hào)
解構(gòu)賦值的用途
- 交換變量的值
- 從函數(shù)返回多個(gè)值
- 函數(shù)參數(shù)的定義
- 提取JOSN數(shù)據(jù)
- 函數(shù)參數(shù)的默認(rèn)值
- 遍歷Map結(jié)構(gòu)
- 輸入模塊的指定方法
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
vue基于ElementUI動(dòng)態(tài)設(shè)置表格高度的3種方法
ElementUI+vue動(dòng)態(tài)設(shè)置表格高度的幾種方法,拋磚引玉,還有其它方法動(dòng)態(tài)設(shè)置表格高度,大家可以開動(dòng)腦筋2025-02-02
微信小程序注冊(cè)60s倒計(jì)時(shí)功能 使用JS實(shí)現(xiàn)注冊(cè)60s倒計(jì)時(shí)功能
這篇文章主要介紹了微信小程序注冊(cè)60s倒計(jì)時(shí)功能,以及使用JS實(shí)現(xiàn)注冊(cè)60s倒計(jì)時(shí)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Javascript限制網(wǎng)頁只能在微信內(nèi)置瀏覽器中訪問
最近正在開發(fā)一個(gè)微信公眾賬號(hào),其中有一項(xiàng)功能是用戶發(fā)送文字消息給公眾號(hào),然后公眾號(hào)返回圖文消息給用戶,用戶再點(diǎn)擊圖文消息即可跳轉(zhuǎn)到一個(gè)網(wǎng)頁鏈接,在微信的內(nèi)置瀏覽器中打開。2014-11-11
JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕切換網(wǎng)頁背景色的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕切換網(wǎng)頁背景色的方法,涉及JavaScript基于鼠標(biāo)事件動(dòng)態(tài)操作頁面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
JavaScript檢查數(shù)字是否為整數(shù)或浮點(diǎn)數(shù)的方法
這篇文章主要介紹了JavaScript檢查數(shù)字是否為整數(shù)或浮點(diǎn)數(shù)的方法,涉及javascript類型判斷的相關(guān)技巧,需要的朋友可以參考下2015-06-06
JS實(shí)現(xiàn)玩轉(zhuǎn)風(fēng)車
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)玩轉(zhuǎn)風(fēng)車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
JavaScript中停止執(zhí)行setInterval和setTimeout事件的方法
這篇文章主要介紹了JavaScript中停止執(zhí)行setInterval和setTimeout事件的方法,本文給出操作實(shí)例代碼和語法介紹,需要的朋友可以參考下2015-05-05
BootStrap數(shù)據(jù)表格實(shí)例代碼
本文通過實(shí)例代碼給大家分享了BootStrap數(shù)據(jù)表格的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-09-09

