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