摘要:指北詳談解構(gòu)賦值附贈(zèng)練習(xí)題一何謂解構(gòu)賦值基本概念首先我們看一下給的定義解構(gòu)賦值語(yǔ)法是一個(gè)表達(dá)式,這使得可以將值從數(shù)組或?qū)傩詮膶?duì)象提取到不同的變量中從定義中,我們可以發(fā)現(xiàn)解構(gòu)賦值的作用是對(duì)變量進(jìn)行賦值主要通過(guò)兩個(gè)方面實(shí)現(xiàn)這個(gè)作用數(shù)組將數(shù)組中的
ES6指北【6】——詳談解構(gòu)賦值【附贈(zèng)練習(xí)題】 一、何謂解構(gòu)賦值? 1. 基本概念
首先我們看一下MDN給的定義
解構(gòu)賦值語(yǔ)法是一個(gè) Javascript 表達(dá)式,這使得可以將值從數(shù)組或屬性從對(duì)象提取到不同的變量中
從定義中,我們可以發(fā)現(xiàn):
解構(gòu)賦值的作用是對(duì)變量進(jìn)行賦值
主要通過(guò)兩個(gè)方面實(shí)現(xiàn)這個(gè)作用
數(shù)組【將數(shù)組中的值賦給變量】
let [a, b, c] = [0, 1, 2] console.log(a, b, c) // 0 1 2
對(duì)象【將對(duì)象中屬性的值賦給變量】
let obj = {a: 0, b: 1, c: 2} // es5我們想把obj的值給取出來(lái)非常麻煩,而且obj的屬性過(guò)多的話,還要進(jìn)行遍歷 let a = obj.a let b = obj.b let c = obj.c // es6通過(guò)解構(gòu)賦值就會(huì)非常簡(jiǎn)單 let {a: a, b: b, c: c} = obj // 對(duì)象鍵值相同,可以只寫(xiě)一個(gè)【ES6提供的語(yǔ)法糖】,所以我們還可以簡(jiǎn)寫(xiě)成下面這個(gè)樣子 let {a, b, c} = obj console.log(a, b, c) // 0 1 22. 模式匹配
很多初學(xué)者都很難理解的問(wèn)題是左邊是數(shù)組/對(duì)象,右邊也是數(shù)組/對(duì)象,是怎么進(jìn)行匹配的呢?
其實(shí)這是對(duì)解構(gòu)賦值一個(gè)非常大的誤解。解構(gòu)賦值的本質(zhì)是模式匹配——只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值
所以表達(dá)式的左邊并不是數(shù)組/對(duì)象,而是變量的集合,只不過(guò)它的模式要與數(shù)組/對(duì)象相對(duì)應(yīng),這里要特別強(qiáng)調(diào)的是對(duì)象的模式匹配還要保持鍵名【key】相同
那么現(xiàn)在我們就可以重新定義一下解構(gòu)賦值了:把一些東西解放出來(lái)【解構(gòu)】,按照模式匹配對(duì)應(yīng)地賦值給其它變量
當(dāng)然,上述示例適合于普通的變量聲明,工作中我們會(huì)遇到許多特殊情況,這就需要解構(gòu)賦值的特殊用法了
二、解構(gòu)賦值的常見(jiàn)特殊用法 1. 給部分變量賦值// 數(shù)組 let [a, , c, , e] = [1, 2, 3, 4, 5] console.log(a, c, e) // 1 3 5 // 不適用于對(duì)象2. 設(shè)置默認(rèn)值
這里類(lèi)似于函數(shù)默認(rèn)參數(shù)值【ES6指北4有講解,感興趣的朋友可以去看看】,先看個(gè)例子
// 數(shù)組 let [a, b, c, d] = [1, 2, 3] console.log(d) // undefined // 這里的d未被賦值,所以值為undefined // 在這種情況我們可以像對(duì)函數(shù)參數(shù)設(shè)置默認(rèn)值一樣,對(duì)d也設(shè)置默認(rèn)值 let [a, b, c, d = 4] = [1, 2, 3] console.log(d) // 4 // 對(duì)象 let {a = {}, b = 1} = {a: undefined, b: 10} console.log(a, b) // {} 103. 與函數(shù)返回值結(jié)合
// 數(shù)組 let f = () => [1, 2, 3] let [a, b] = f() console.log(a, b) // 對(duì)象 let f = () => { return {a: 0, b: 1, c: 2} } let {a, b} = f() console.log(a, b) // 0 14. 與rest參數(shù)結(jié)合
// 數(shù)組 let [a, ...args] = [10, 2, 3, 4, 5] console.log(args) // [2, 3, 4, 5] // 對(duì)象 let {a, ...args} = {a: 10, b: 5, c: 3} console.log(args) // {b: 5, c: 3}5. 與函數(shù)參數(shù)結(jié)合
// 對(duì)象 function test({x: y = 2}) { console.log(y) } // 等價(jià)于下面的形式 function test() { let {x: y = 2} = arguments[0] console.log(y) } // 這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),如果參數(shù)與結(jié)構(gòu)賦值結(jié)合的話,等于對(duì)參數(shù)做出了數(shù)據(jù)類(lèi)型【對(duì)象】的約束 // 比如,如果你傳遞的參數(shù)為字符串 test("asdf") // 那么代碼的邏輯是這樣的 let {x: y = 2} = "asdf" // 模式不匹配,解構(gòu)失敗 // 那么自然會(huì)報(bào)錯(cuò)了 // 如果你希望傳遞其它數(shù)據(jù)類(lèi)型不報(bào)錯(cuò)的話,也很簡(jiǎn)單,為參數(shù)添加默認(rèn)值就行【默認(rèn)值為對(duì)象】 function test({x: y = 2} = {}) { console.log(y) } // 數(shù)組 function test([a = 1, b = 2]) { console.log(a, b) }三、練習(xí)題 練習(xí)一
let obj = {a: 1, b: 2, c: {d: {e: 5}}} let {a, b, c: qoyqs8suu2u} = obj console.log(d) // ?練習(xí)二
function drawES2015Chart({size = "big", cords = {x: 0, y: 0}, radius = 25} = {}) { console.log(size, cords, radius); } drawES2015Chart() // ? drawES2015Chart({size: "small", cords: {a: 1}, radius: {b: 1}}) // ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97131.html
摘要:如何學(xué)習(xí)的學(xué)習(xí)順序以此類(lèi)推沒(méi)學(xué)好就別想學(xué)好邊學(xué)邊用學(xué)了就要用變量聲明的方式上面兩個(gè)是的語(yǔ)法,下面兩個(gè)是的語(yǔ)法塊級(jí)作用域看會(huì)聲明一個(gè)全局變量嗎顯然當(dāng)聲明了全局變量后,是無(wú)法再聲明全局變量的,只能對(duì)其賦值結(jié)論含義不明的問(wèn)題下面的代碼不會(huì)執(zhí) 1.如何學(xué)習(xí)ES6 1.1 js的學(xué)習(xí)順序 ES5 -> ES6 -> ES7 -> ES8 以此類(lèi)推 ES5沒(méi)學(xué)好就別想學(xué)好ES6 1.2 邊學(xué)邊用 ...
摘要:如何學(xué)習(xí)的學(xué)習(xí)順序以此類(lèi)推沒(méi)學(xué)好就別想學(xué)好邊學(xué)邊用學(xué)了就要用變量聲明的方式上面兩個(gè)是的語(yǔ)法,下面兩個(gè)是的語(yǔ)法塊級(jí)作用域看會(huì)聲明一個(gè)全局變量嗎顯然當(dāng)聲明了全局變量后,是無(wú)法再聲明全局變量的,只能對(duì)其賦值結(jié)論含義不明的問(wèn)題下面的代碼不會(huì)執(zhí) 1.如何學(xué)習(xí)ES6 1.1 js的學(xué)習(xí)順序 ES5 -> ES6 -> ES7 -> ES8 以此類(lèi)推 ES5沒(méi)學(xué)好就別想學(xué)好ES6 1.2 邊學(xué)邊用 ...
摘要:箭頭函數(shù)基本語(yǔ)法函數(shù)語(yǔ)法具名函數(shù)匿名函數(shù)三句話第一句話聲明第二句話聲明匿名函數(shù)第三句話把匿名函數(shù)賦值給箭頭函數(shù)語(yǔ)法特點(diǎn)只能做賦值,不能做聲明第一種寫(xiě)法完全寫(xiě)法不省略參數(shù)個(gè)數(shù),不省略函數(shù)體花括號(hào)參數(shù)個(gè)數(shù)函數(shù)體內(nèi)語(yǔ)句個(gè)數(shù)第二種寫(xiě)法省略參數(shù)括號(hào)參 1.箭頭函數(shù)基本語(yǔ)法 1.1 ES3 函數(shù)語(yǔ)法 // 具名函數(shù) function xxx(arg1, arg2) { console.lo...
摘要:但是,的本質(zhì)仍然是函數(shù),是構(gòu)造函數(shù)的另外一種寫(xiě)法。報(bào)錯(cuò)原生構(gòu)造函數(shù)的繼承對(duì)于一些原生的構(gòu)造函數(shù),比如,,,等,在是無(wú)法通過(guò)方法實(shí)現(xiàn)原生函數(shù)的內(nèi)部屬性,原生函數(shù)內(nèi)部的無(wú)法綁定,內(nèi)部屬性獲得不了。 在沒(méi)有學(xué)習(xí) ES6 之前,學(xué)習(xí) React,真的是一件非常痛苦的事情。即使之前你對(duì) ES5 有著很好的基礎(chǔ),包括閉包、函數(shù)、原型鏈和繼承,但是 React 中已經(jīng)普遍使用 ES6 的語(yǔ)法,包括 ...
摘要:那之前的例子來(lái)使用一下的話,你會(huì)發(fā)現(xiàn)瀏覽器報(bào)錯(cuò)了,如圖定義的變量不允許二次修改。如圖箭頭函數(shù)沒(méi)有它自己的值,箭頭函數(shù)內(nèi)的值繼承自外圍作用域。如圖這里兩邊的結(jié)構(gòu)沒(méi)有一致,如果是的話,是可以正常解構(gòu)的。 前言 國(guó)慶假期已過(guò)一半,來(lái)篇干貨壓壓驚。 ES6,并不是一個(gè)新鮮的東西,ES7、ES8已經(jīng)趕腳了。但是,東西不在于新,而在于總結(jié)。每個(gè)學(xué)前端的人,身邊也必定有本阮老師的《ES6標(biāo)準(zhǔn)入門(mén)》或...
閱讀 2163·2021-11-22 15:22
閱讀 1301·2021-11-11 16:54
閱讀 1833·2021-09-23 11:32
閱讀 3028·2021-09-22 10:02
閱讀 1786·2019-08-30 12:59
閱讀 1100·2019-08-29 16:27
閱讀 634·2019-08-29 13:21
閱讀 2473·2019-08-28 17:57