成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

ES6指北【6】——詳談解構(gòu)賦值【附贈(zèng)練習(xí)題】

sorra / 1582人閱讀

摘要:指北詳談解構(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 2
2. 模式匹配
很多初學(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) // {} 10
3. 與函數(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 1
4. 與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

相關(guān)文章

  • ES6指北【1】——let、const

    摘要:如何學(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é)邊用 ...

    張春雷 評(píng)論0 收藏0
  • ES6指北【1】——let、const

    摘要:如何學(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é)邊用 ...

    tain335 評(píng)論0 收藏0
  • ES6指北【2】—— 箭頭函數(shù)

    摘要:箭頭函數(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...

    DobbyKim 評(píng)論0 收藏0
  • ES6,你不得不學(xué)!

    摘要:但是,的本質(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ǔ)法,包括 ...

    CKJOKER 評(píng)論0 收藏0
  • ES6常用知識(shí)點(diǎn)概述

    摘要:那之前的例子來(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)》或...

    keithyau 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<