摘要:比如上面展示的情況都是可以聯(lián)合使用的比如對(duì)象的解構(gòu)賦值對(duì)象的解構(gòu)賦值是基于屬性的。當(dāng)給已存在的變量解構(gòu)賦值時(shí),注意加這是由于如果不加會(huì)把左邊看成一個(gè)代碼塊,會(huì)報(bào)錯(cuò)。注意事項(xiàng)數(shù)組的解構(gòu)賦值中,使用的變量必須放在最后。
解構(gòu)賦值
解構(gòu)賦值是一個(gè)聽(tīng)起來(lái)比較高大上的特性,但按我的理解,它就是一種語(yǔ)法糖。它并沒(méi)有賦予js更強(qiáng)大的能力,只是讓賦值操作更加的靈活,效率。
在es6之前,賦值操作需要=左邊是一個(gè)變量,右邊是一個(gè)數(shù)據(jù)或返回?cái)?shù)據(jù)的函數(shù)等。
而解構(gòu)賦值,是將=右邊的結(jié)構(gòu)分解(解構(gòu)),然后按照格式給=左邊進(jìn)行賦值,主要分為數(shù)組的解構(gòu)賦值和對(duì)象的解構(gòu)賦值。
解構(gòu)賦值的格式為,=左邊為解構(gòu)賦值的語(yǔ)法,=右邊為初始化器,即一個(gè)對(duì)象或數(shù)組。
數(shù)組的解構(gòu)賦值數(shù)組的解構(gòu)賦值是基于數(shù)組位置的,比如:
let [a,b] = [1,2] // 結(jié)果a等于1,b等于2
也可以通過(guò)解構(gòu)改變變量的值。比如:
let a = 1, b = 2; [a,b] = [100, 200];
當(dāng)=左邊與右邊不完全匹配時(shí),未能匹配到的變量會(huì)被賦值為undefined,比如:
let [a,b,c] = [1,2] //a為1,b為2,c為undefined
所以可以通過(guò)給一些變量指定默認(rèn)值,以防止這種情況的發(fā)生。比如:
let [a,b,c=3] = [1,2] //a==1, b==2, c==3
注意:只有當(dāng)在右邊找不到對(duì)應(yīng)的值或值為undefined時(shí),才會(huì)使用默認(rèn)值。
有時(shí)候,解構(gòu)賦值中,你可能只關(guān)心一部分?jǐn)?shù)據(jù),這時(shí)可以通過(guò)占位符只給某些值賦值。比如:
let [a,,,b,,] = [1,2,3,4,5,6,7,8] //a==1 b==4
在解構(gòu)賦值中,通過(guò)在變量前加...號(hào),表示生成的變量為一個(gè)數(shù)組。比如:
let [a,,...b] = [1,2,3,4,5] //a == 1, b==[3,4,5]
上面展示的情況都是可以聯(lián)合使用的,比如:
let [a,b=8,,..c] = [1,2,3,4,5,6] //a==1 b==2 c=[4,5,6]對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)賦值是基于屬性的。比如:
let {name, age} = { name: "icode007", age: 27 } //name == "icode007" age==27
與數(shù)組的解構(gòu)賦值一樣,對(duì)象的解構(gòu)賦值一樣給未能解構(gòu)的變量賦值undefined,一樣可以使用默認(rèn)值。
當(dāng)給已存在的變量解構(gòu)賦值時(shí),注意加()
let name, age; ({name, age} = {name: "icode007", age: 27});
這是由于如果不加(),js會(huì)把左邊看成一個(gè)代碼塊,會(huì)報(bào)錯(cuò)。 加了()后,整個(gè)變成了一個(gè)合法的表達(dá)式。
在上面的解構(gòu)賦值中,變量名和對(duì)象中的屬性名必須相同,只有這樣,才能找到對(duì)應(yīng)的要解構(gòu)賦值的數(shù)據(jù)。
但如果我們想要給數(shù)據(jù)賦一個(gè)不同的名字呢? 也是有辦法的。
let {name:myName, age: myAge} = {name: "icode007", age: 27}
這樣相應(yīng)的名字和年齡就被賦值給myName和myAge了。
也可以同時(shí)使用默認(rèn)值:
let {name:myName, age: myAge, jog: myJob = "soft Engineer"} = {name: "icode007", age: 27}
以上我們列舉的對(duì)象的解構(gòu)賦值的例子都非常的簡(jiǎn)單,但在實(shí)際開(kāi)發(fā)中,JSON數(shù)據(jù)可能是非常復(fù)雜的,這時(shí)的解構(gòu)賦值語(yǔ)法也可能變得復(fù)雜。比如:
let node = { type: "Identifier", name: "foo", loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }; let {loc: { start }} = node; console.log(start.line); console.log(start.column);
注意:每當(dāng)有:出現(xiàn)在解構(gòu)賦值中時(shí),:左邊的標(biāo)識(shí)符表示要檢查的位置,右邊表示要賦值的目標(biāo),如果右邊是{}或[]時(shí),表示要賦值的變量在更深層次結(jié)構(gòu)中。
上面的所有實(shí)例,如默認(rèn)值,變量更名等特性都可能存在于一個(gè)解構(gòu)賦值語(yǔ)句中。并且,數(shù)組的解構(gòu)賦值與對(duì)象的解構(gòu)賦值,也可以混合使用。這為我們從復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中提取相應(yīng)數(shù)據(jù)提供了極大的便利。
函數(shù)參數(shù)的解構(gòu)函數(shù)參數(shù)的解構(gòu)功能對(duì)于實(shí)現(xiàn)多參的函數(shù)是非常有用的。
比如
function setCookie(name, value, options){ options = options || {}; var secure = option.secure, path = option.path, domain = option.domain ; //... } setCookie("type", "js", { secure: true, expires: 60000 })
上面的函數(shù)是常用的實(shí)現(xiàn)多參函數(shù)的方式,name, value為必填參數(shù),所有可選參數(shù)封裝到options中,作為options的屬性使用。
但上面的函數(shù)存在一個(gè)問(wèn)題就是,你只看函數(shù)的定義,是無(wú)法知道到底可選參數(shù)的名稱(chēng)是什么的?你需要閱讀函數(shù)代碼,了解函數(shù)才能使用它。
使用函數(shù)參數(shù)解構(gòu)則直觀很多:
function setCookie(name, value, {secure, path, domain}){ //... }
使用同樣的使用方式可以調(diào)用這個(gè)函數(shù)。
但是這種寫(xiě)法有種問(wèn)題是當(dāng)只傳入name和value參數(shù)時(shí),會(huì)報(bào)錯(cuò)。
更好的寫(xiě)法是使用函數(shù)的默認(rèn)參數(shù)。
function setCookie(name, value, {secure, path = "/", domain} = {}){ //... }注意事項(xiàng)
數(shù)組的解構(gòu)賦值中,使用...rest的變量必須放在最后。
與普通的變量的賦值語(yǔ)句一樣,解構(gòu)賦值語(yǔ)句也是有值的,它的值就是=右邊的內(nèi)容。
最佳實(shí)踐變量交換值
在es6之前,交換兩個(gè)變量的值,需要?jiǎng)?chuàng)建一個(gè)中間變量,類(lèi)似這樣
var a = 1, b = 2, temp; temp = a; a = b; b = temp;
現(xiàn)在只需要一行代碼:
[a,b] = [b,a]
提取json中的一些數(shù)據(jù)
在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)解構(gòu)是非常復(fù)雜的,使用對(duì)象屬性去層層調(diào)用的語(yǔ)法非常不直觀,通過(guò)解構(gòu)賦值,可以讓代碼更加的直觀與簡(jiǎn)潔。
數(shù)組的復(fù)制
數(shù)組的解構(gòu)賦值中,有個(gè)小技巧。
let arr = [1,4,9,55,244]; let [...cloneArray] = arr; console.log(cloneArray);
這樣就實(shí)現(xiàn)了數(shù)組的淺復(fù)制,而在以前,數(shù)組的復(fù)制都是通過(guò)concat()方法來(lái)完成。
更多es6的內(nèi)容,可以關(guān)注我的專(zhuān)欄--學(xué)習(xí)ES6.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107514.html
摘要:另外對(duì)于已經(jīng)聲明的變量進(jìn)行解構(gòu)賦值時(shí),要非常小心。因此在行首加,將其強(qiáng)制轉(zhuǎn)化為表達(dá)式執(zhí)行。由于和無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)。 let和const let和const是es6新增的兩個(gè)變量聲明關(guān)鍵字,與var的不同點(diǎn)在于: (1)let和const都是塊級(jí)作用域,在{}內(nèi)有效,這點(diǎn)在for循環(huán)中非常有用,只在循環(huán)體內(nèi)有效。var為函數(shù)作用域。 (2)使用let和con...
摘要:前言前言該篇筆記是第二篇變量的解構(gòu)賦值。這一章原文鏈接變量的解構(gòu)賦值解構(gòu)賦值解構(gòu)賦值允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱(chēng)為解構(gòu)。對(duì)象的解構(gòu)賦值是根據(jù)對(duì)象值進(jìn)行匹配。前言該篇筆記是第二篇 變量的解構(gòu)賦值。這一章原文鏈接: 變量的解構(gòu)賦值解構(gòu)賦值ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱(chēng)為解構(gòu)(Destructuring)。解構(gòu)賦值是對(duì)賦值運(yùn)...
摘要:前言該篇筆記是第二篇變量的解構(gòu)賦值。這一章原文鏈接變量的解構(gòu)賦值解構(gòu)賦值允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱(chēng)為解構(gòu)。對(duì)象的解構(gòu)賦值是根據(jù)對(duì)象值進(jìn)行匹配。 前言該篇筆記是第二篇 變量的解構(gòu)賦值。 這一章原文鏈接: 變量的解構(gòu)賦值解構(gòu)賦值ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)...
摘要:數(shù)組的解構(gòu)賦值特點(diǎn)根據(jù)數(shù)據(jù)的下標(biāo)來(lái)賦值的,有次序。模式能夠匹配起來(lái),如長(zhǎng)度為數(shù)值和布爾值的解構(gòu)賦值解構(gòu)賦值的規(guī)則是只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象。布爾值解構(gòu)賦值為字符串的一種。在很多獨(dú)立細(xì)小的方面,解構(gòu)賦值都非常有用。 1、解構(gòu)賦值簡(jiǎn)介 官方解釋?zhuān)喊凑找欢ǖ哪J?,從?shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱(chēng)為解構(gòu)(Destructuring)。 舉個(gè)例子,想獲取數(shù)組中...
摘要:解構(gòu)賦值的分類(lèi)數(shù)組解構(gòu)賦值對(duì)象解構(gòu)賦值字符串解構(gòu)賦值數(shù)值解構(gòu)賦值布爾值解構(gòu)賦值函數(shù)參數(shù)解構(gòu)賦值。嵌套情況默認(rèn)值解構(gòu)賦值允許設(shè)置默認(rèn)值,當(dāng)數(shù)組成員嚴(yán)格等于,默認(rèn)值將生效。報(bào)錯(cuò)報(bào)錯(cuò)函數(shù)參數(shù)的解構(gòu)賦值函數(shù)的參數(shù)也可以使用解構(gòu)賦值和指定默認(rèn)值 ES6可以從數(shù)組和對(duì)象中提取值,然后對(duì)變量進(jìn)行賦值。解構(gòu)賦值的分類(lèi):數(shù)組解構(gòu)賦值、對(duì)象解構(gòu)賦值 、字符串解構(gòu)賦值、數(shù)值解構(gòu)賦值、布爾值解構(gòu)賦值、 函數(shù)參...
閱讀 1586·2021-11-25 09:43
閱讀 2489·2019-08-30 15:54
閱讀 2953·2019-08-30 15:53
閱讀 1104·2019-08-30 15:53
閱讀 761·2019-08-30 15:52
閱讀 2553·2019-08-26 13:36
閱讀 824·2019-08-26 12:16
閱讀 1222·2019-08-26 12:13