摘要:解構(gòu)賦值解構(gòu)賦值簡(jiǎn)單來(lái)說(shuō)就是對(duì)應(yīng)位置數(shù)組或?qū)?yīng)鍵名對(duì)象的變量匹配過(guò)程。字符串集合使用結(jié)構(gòu)賦值實(shí)現(xiàn)疊加并交換變量對(duì)象的解構(gòu)賦值對(duì)象的解構(gòu)賦值與變量位置次序無(wú)關(guān)只取決于鍵名是否嚴(yán)格相等。
解構(gòu)賦值
解構(gòu)賦值簡(jiǎn)單來(lái)說(shuō)就是 對(duì)應(yīng)位置(數(shù)組)或?qū)?yīng)鍵名(對(duì)象)的變量匹配過(guò)程。如果匹配失敗, 對(duì)于一般變量匹配不到結(jié)果就是 undefined, 對(duì)于具有展開(kāi)運(yùn)算符(...)的變量結(jié)果就是空數(shù)組。
數(shù)組的解構(gòu)賦值var [a, b, c] = [1, 2, 3]; //a=1, b=2, c=3 var [, , c] = [1, 2, 3]; //c=3 var [x, , y] = [1, 2, 3]; //x=1, y=3 var [head, ...tail] = [1, 2, 3, 4]; //head = 1, tail = [2, 3, 4]; var [x, y, ...z] = [1]; //x=1, y=undefined, z=[]; var [a, [b, c], d] = [1, [2, 3], 4]; //a=1.b=2, c=3, d=4 var [a, [b], d] = [1, [2, 3], 4]; //a=1.b=2, d=4
數(shù)組的解構(gòu)賦值可以具有默認(rèn)值, 在 ES6中對(duì)于目標(biāo)數(shù)據(jù)使用嚴(yán)格相等(===)比較是否為空(undedined)。如果默認(rèn)值是表達(dá)式, 那么對(duì)于該表達(dá)式采用惰性求值, 即只有在對(duì)應(yīng)位置為空(undedined)時(shí)才執(zhí)行該表達(dá)式。
var [a=1, b] = []; //a=1, b=undefined var [a=1, b] = [2, 3]; //a=2, b=3 var [a=1, b] = [undefined, 3]; //a=1.b=3 var [a=1, b] = [null, 3]; //a=null, b=3 var [a=1, b] = [NaN, 3]; //a=NaN, b=3 function f(){ console.log("done"); return 2; } var [a=f()] = [1]; //a=1 var [a=f()] = []; //a=2, 輸出 "done"
解構(gòu)賦值的右側(cè)表達(dá)式在必要的隱式轉(zhuǎn)換后如果不具有 iterator 則遍歷失敗, 關(guān)于 iterator, 具體看iterator部分。這里可以先記住, 左邊是數(shù)組結(jié)構(gòu)的解構(gòu)賦值, 右側(cè)可以是數(shù)組, 字符串, 集合, Generator 函數(shù), map等。
//字符串 var [a, b, c, d] = "123"; //a="1", b="2", c="3", d=undefined //集合 var [a, b, c] = new Set(["1", "2", "3"]); //a="1", b="2", c="3" //Generator function* fib(){ let a = 1; let b = 1; while(1){ yield a; [a, b] = [b, a + b]; //使用結(jié)構(gòu)賦值實(shí)現(xiàn)疊加并交換變量 } } var [a, b, c, d, e, f] = fib(); //a=1, b=1, c=2, d=3, e=5, f=8 //map var map = new Map(); map.set("a", 1); map.set("b", 2); var [a, b] = map; //a=["a", 1], b=["b", 2]對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)賦值與變量位置次序無(wú)關(guān), 只取決于鍵名是否嚴(yán)格相等(===)。如果匹配失敗, 結(jié)果就是 undefined
var {a, b, f} = {b:2, a:3, d:4}; //a=3, b=2, f=undefined var node = { loc: { start:{ x:1, y:2 } } }; var {loc: {start: {x:line}}} = node; //line=1
可以在復(fù)制時(shí)對(duì)屬性重命名, 但此時(shí)原名只用于匹配參數(shù), 不生成變量:
var {name:alias} = {name:"Bob"}; //alias="Bob" console.log(name); //"global" console.log(alias); //"Bob"
對(duì)象解構(gòu)同樣可以指定默認(rèn)值, 默認(rèn)值生效(或表達(dá)式被行)的條件是對(duì)應(yīng)屬性值嚴(yán)格等于(===) undefined
var {a:3, b} = {b:2}; //a=3, b=2 var {a:3, b} = {a:null, b:2}; //a=null, b=2
解構(gòu)嵌套對(duì)象父屬性不存在會(huì)報(bào)錯(cuò):
var {foo:{bar}} = {ba: 2}; //報(bào)錯(cuò)
解構(gòu)對(duì)象如果和聲明分開(kāi), 獨(dú)立成為一行要加圓括號(hào), 就想用 eval 解析 JSON 字符串的時(shí)候一樣。因?yàn)橄到y(tǒng)會(huì)把一行開(kāi)頭花括號(hào)默認(rèn)作為塊級(jí)作用域的開(kāi)始, 而不是對(duì)象的開(kāi)始。
var a, b; ({a, b} = {a:2, b:10}); //a=2, b=10 {a, b} = {a:2, b:10}; //報(bào)錯(cuò) //以下表達(dá)式無(wú)意義, 但沒(méi)有錯(cuò) ({}=[1, 2]); ({}="abc"); ({}=[]);
注意, 除了這樣的情況, 不要濫用圓括號(hào)
右側(cè)變量通過(guò)隱式類型轉(zhuǎn)換可以轉(zhuǎn)為對(duì)象的情況下也可以結(jié)構(gòu)賦值:
var {toString: s} = 123; //s=Number.prototype.toString
技巧: 解構(gòu)的用處很多, 包括交換變量, 簡(jiǎn)化傳參(可帶默認(rèn)值),
//參數(shù)傳遞 function f([x, y, z=4]){ return [x+1, y+2, z+3]; } var [a, b, c] = f([1, 2]); //a=2, b=4, c=7 [[1, 2], [3, 4]].map(([a, b]) => a + b); //返回 [3, 7]
//交換變量 var a=2, b=4; [a, b] = [b, a]; //a=4, b=2
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97425.html
摘要:數(shù)組的解構(gòu)賦值允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)。如果變量名與屬性名不一致,必須寫成下面這樣。 1 數(shù)組的解構(gòu)賦值 ES6允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。 基本用法 { var [a,[b,c],d,,...f] = [1,[2,3],4,5,6,7]; console...
摘要:對(duì)象的解構(gòu)賦值函數(shù)執(zhí)行后,返回的是一個(gè)對(duì)象。分別取出對(duì)象中屬性為和的值,根據(jù)解構(gòu)賦值的規(guī)則,在左側(cè)聲明變量,放在大括號(hào)中,變量名要和屬性名保持一致。箭頭函數(shù)在中,箭頭函數(shù)就是函數(shù)的一種簡(jiǎn)寫形式允許使用箭頭定義函數(shù)。 原文博客地址,歡迎學(xué)習(xí)交流:點(diǎn)擊預(yù)覽 聲明變量 可以使用let、const關(guān)鍵字聲明變量,而不推薦使用var聲明變量 var聲明變量的問(wèn)題: 可以多次重復(fù)聲明同一個(gè)變量...
摘要:一簡(jiǎn)介與的關(guān)系是的規(guī)格,是的一種實(shí)現(xiàn)另外的方言還有和轉(zhuǎn)碼器命令行環(huán)境安裝直接運(yùn)行代碼命令將轉(zhuǎn)換成命令瀏覽器環(huán)境加入,代碼用環(huán)境安裝,,根目錄建立文件加載為的一個(gè)鉤子設(shè)置完文件后,在應(yīng)用入口加入若有使用,等全局對(duì)象及上方法安裝 一、ECMAScript6 簡(jiǎn)介 (1) 與JavaScript的關(guān)系 ES是JS的規(guī)格,JS是ES的一種實(shí)現(xiàn)(另外的ECMAScript方言還有Jscript和...
摘要:否則調(diào)用時(shí)依然需要傳參報(bào)錯(cuò)注意這里不能用觸發(fā)默認(rèn)值這里我們還需要單獨(dú)討論一下默認(rèn)參數(shù)對(duì)的影響很明顯,默認(rèn)參數(shù)并不能加到中。關(guān)于作用域集中在函數(shù)擴(kuò)展的最后討論。那如果函數(shù)的默認(rèn)參數(shù)是函數(shù)呢?zé)X的要來(lái)了如果基礎(chǔ)好那就根本談不上不燒腦。 參數(shù)默認(rèn)值 ES5中設(shè)置默認(rèn)值非常不方便, 我們這樣寫: function fun(a){ a = a || 2; console.log(a); ...
摘要:是這樣描述解構(gòu)賦值的解構(gòu)賦值語(yǔ)法是一種表達(dá)式用來(lái)將數(shù)組中的值或?qū)ο笾械膶傩匀〕鰜?lái)區(qū)分為不同變量。現(xiàn)在讓我們將坐標(biāo)點(diǎn)放進(jìn)一個(gè)數(shù)組中現(xiàn)在要對(duì)這些點(diǎn)進(jìn)行處理,傳統(tǒng)可以想到的方法是這樣的借助解構(gòu)賦值,能變得這樣簡(jiǎn)潔使用箭頭函數(shù)更簡(jiǎn)潔 JavaScript是一種很有趣的語(yǔ)言,我個(gè)人很喜歡它,雖然仍還有些人不大喜歡它。在ECMAScript6(ES6)中,有許多有用的特性來(lái)使JavaScript開(kāi)...
閱讀 3391·2023-04-25 14:07
閱讀 3458·2021-09-28 09:35
閱讀 2091·2019-08-30 15:55
閱讀 1405·2019-08-30 13:48
閱讀 2502·2019-08-30 13:16
閱讀 3202·2019-08-30 12:54
閱讀 3238·2019-08-30 11:19
閱讀 1876·2019-08-29 17:17