摘要:具體的分析暫時(shí)不討論解決的方式很簡(jiǎn)單,把上面的代碼塊變成一段表達(dá)式就小明總結(jié)解構(gòu)賦值是提供一個(gè)十分方便的表達(dá)式。的解構(gòu)賦值小明的對(duì)象賦值這里可以被賦予初始值小明對(duì)象的屬性不存在能夠賦值給多個(gè)變量
對(duì)象解構(gòu)賦值
ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。
--- 阮一峰《ECMAScript 6 入門》
具體的對(duì)象解構(gòu)賦值的規(guī)則可以參考 對(duì)象的解構(gòu)賦值, 說的很詳細(xì)。
作為一個(gè)前端程序員,對(duì)于ES6這個(gè)新的語法表達(dá)式,肯定是需要熟練使用的,下面是我個(gè)人的一些理解。給大家分享一下。
在ES6沒有出現(xiàn)以前,我們是這樣把對(duì)象中的值賦給變量的。
// 第一版 var obj = {name: "小明", age: 12, sex: "男"}; var name = obj.name; var age = obj.age; var sex = obj.sex; var phone = obj.phone // phone => undefined
然后有人說這里,var被使用多次, 不好。 于是修改為下面這樣?
// 第二版 var obj = {name: "小明", age: 12, sex: "男"}; var name = obj.name, age = obj.age, sex = obj.sex, phone = obj.phone;
有人說,obj這個(gè)對(duì)象被多次調(diào)用,不好...... 于是ES6來了。被修改為下面這樣?
// 第三版 let obj = {name: "小明", age: 12, sex: "男"}; let {name, age, sex, phone} = obj
暫時(shí)沒有人說不好了。
當(dāng)我們想把對(duì)象中的屬性值賦給變量的時(shí)候。一般需要考慮兩個(gè)因素。分別是屬性值、變量。而屬性是通過屬性名決定的,變量是通過變量名決定的。所以,最后決定因素就是屬性名,變量名。當(dāng)我們能夠確定屬性名和變量名的時(shí)候,它們對(duì)應(yīng)的屬性值和變量值之間的賦值關(guān)系也就確定了。
所以在ES6的解構(gòu)賦值中,大致可以分為兩種情形。屬性名與被賦值的變量名一致與不一致
1. 屬性名與變量名不一致當(dāng)屬性名稱與變量名稱不一致的,需要顯式的指定屬性名。這樣才能把屬性值給賦值到變量中。
例如:
let user = {name: "小明", age: 12}; let {name: userName, age: userAge} = user; console.log(userName); // "小明" console.log(userAge); // 122. 屬性名與變量名一致
當(dāng)屬性名稱與變量名稱一致的,就只需要顯示的指定變量名。
let user = {name: "小明", age: 12}; let {name, age} = user; console.log(name); console.log(age);
這里的語法結(jié)構(gòu)跟前面也不一樣,把變量名和屬性名合并在一起。
當(dāng)然了,上面是常見的賦值情況,還有一些其他條件下也是需要考慮的。
其他關(guān)注點(diǎn)當(dāng)要給變量賦值的屬性不存在,會(huì)給變量提供一個(gè)默認(rèn)值undefined
let user = {name: "小明", age: 12}; let { address: userAddress} = user; console.log(userAddress); //userAddress的就是undefined
當(dāng)要給變量賦值的屬性不存在的時(shí)候,變量是能夠被賦予默認(rèn)值
// 屬性不存在 let user = {name: "小明", age: 12}; let {address: userAddress = "上海"} = user; console.log(userAddress); // 由于user中不存在address屬性,所以u(píng)serAddress的值是默認(rèn)值 `上海` // 屬性存在 let user = {name: "小明", age: 12}; let {name: userName = "小天"} = user; console.log(userName); // userName => "小明" // 因?yàn)閷傩源嬖?,變量無法獲取默認(rèn)值
對(duì)象中的一個(gè)屬性值是可以同時(shí)賦予給多個(gè)變量。
let user = {name: "小明", age: 12}; let { name: userName, name: user1Name} = user; console.log(userName); // "小明" console.log(user1Name); // "小明"
解構(gòu)賦值是可以嵌套,而且是從對(duì)象最外層開始查找
let user = {name: "小明", age: 12, course: {name: "數(shù)學(xué)", score: 90}}; let {course} = user; console.log(course); // {name: "數(shù)學(xué)", score: 90} let {course: { score }} = user console.log(score) // 90
前面的例子中,都是是let {xxx} = {xxx} 的形式。于是就會(huì)覺得使用解構(gòu)賦值就一定需要使用let、const、var。 其實(shí)不是的。let {xxx} = {xxx} 這只是其中的一種方, 聲明完變量后就對(duì)其進(jìn)行賦值。 解構(gòu)賦值是對(duì)變量的賦值,只要是變量都是可以進(jìn)行賦值的。
例如:
let name; let user = {name: "小明", age: 12}; {name} = user; // Uncaught SyntaxError: Unexpected token = // 程序報(bào)錯(cuò)了,還是需要使用let ?。 // 這里程序報(bào)的錯(cuò)誤是SyntaxError(語法錯(cuò)誤),在程序預(yù)編譯的時(shí)候發(fā)生的。具體的分析暫時(shí)不討論
解決的方式很簡(jiǎn)單,把上面的代碼塊變成一段表達(dá)式就OK
let name; let user = {name: "小明", age: 12}; ({name} = user); console.log(name)總結(jié)
解構(gòu)賦值是ES6提供一個(gè)十分方便的表達(dá)式。 在開始的時(shí)候,上面那么多的規(guī)則,很難記住。于是為了理解。我把ES6代碼轉(zhuǎn)變成下面這種方式,于是很快就明白了。
// ES6 的解構(gòu)賦值 let user = {name: "小明", age: 12}; let {name: userName} = user; // ES5 的對(duì)象賦值 let userName; (這里可以被賦予初始值) let user = {name: "小明", age: 12}; if (user.name !== undefined) { // 對(duì)象的屬性不存在 userName = user.name // user.name 能夠賦值給多個(gè)變量
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93504.html
摘要:它是一個(gè)通用標(biāo)準(zhǔn),奠定了的基本語法。年月發(fā)布了的第一個(gè)版本,正式名稱就是標(biāo)準(zhǔn)簡(jiǎn)稱。結(jié)語的基本擴(kuò)展還有一些沒有在這里詳細(xì)介紹。 前言 ES6標(biāo)準(zhǔn)以及頒布兩年了,但是,好像還沒有完全走進(jìn)我們的日常開發(fā)。這篇文章從ES6的基本類型擴(kuò)展入手,逐步展開對(duì)ES6的介紹。 ECMAScript和JavaScript JavaScript是由Netscape創(chuàng)造的,該公司1996年11月將JavaSc...
摘要:基本原理解構(gòu)是提供的語法糖,其實(shí)內(nèi)在是針對(duì)可迭代對(duì)象的接口,通過遍歷器按順序獲取對(duì)應(yīng)的值進(jìn)行賦值。屬性值返回一個(gè)對(duì)象的無參函數(shù),被返回對(duì)象符合迭代器協(xié)議。迭代器協(xié)議定義了標(biāo)準(zhǔn)的方式來產(chǎn)生一個(gè)有限或無限序列值。 更多系列文章請(qǐng)看 1、基本語法 1.1、數(shù)組 // 基礎(chǔ)類型解構(gòu) let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, ...
摘要:解構(gòu)賦值允許指定默認(rèn)值內(nèi)部使用嚴(yán)格相等運(yùn)算符,判斷一個(gè)位置是否有值。默認(rèn)值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明。注意,對(duì)象的解構(gòu)賦值可以取到繼承的屬性。解構(gòu)賦值使得輸入語句非常清晰。 數(shù)組解構(gòu) 只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值。 let [a, b, c] = [1, 2, 3]; 如果解構(gòu)不成功,變量的值就等于 undefined。 let [foo,...
摘要:是國(guó)際組織于年月日發(fā)布的第六版,正式名為通常被成為或。二模版字面量提供一種簡(jiǎn)單實(shí)現(xiàn)表達(dá)式嵌套的字符串字面量操作,簡(jiǎn)而言之就是能夠以簡(jiǎn)單的方法實(shí)現(xiàn)字符串拼接操作。 本文同步 帶你入門 JavaScript ES6 (一),轉(zhuǎn)載請(qǐng)注明出處。 ES6: 是 ECMA國(guó)際組織于 2015 年 6 月 17 日發(fā)布的 ECMAScript 第六版,正式名為 ECMAScript 2015,通常被...
摘要:兩者對(duì)比就像下面這樣通過對(duì)象把函數(shù)向外開放而使用的模塊就像下面通過導(dǎo)出方法當(dāng)然了,的模塊肯定是比匿名函數(shù)自執(zhí)行更加高級(jí)的一種封裝了。相比于匿名函數(shù),模塊具有下面幾種特點(diǎn)。 什么是ES6模塊? 在ES6中,每個(gè)文件就是一個(gè)模塊,有自己的作用域。在一個(gè)文件里面定義的變量、函數(shù)、類,都是私有的,對(duì)其他文件不可見。在看到這里的時(shí)候感覺很熟悉,這不就是匿名函數(shù)自執(zhí)行,然后一個(gè)個(gè)匿名函數(shù)放在一個(gè)個(gè)...
閱讀 3524·2021-11-17 17:01
閱讀 3933·2021-11-08 13:12
閱讀 2487·2021-10-08 10:04
閱讀 707·2021-09-29 09:35
閱讀 1429·2021-09-26 10:12
閱讀 2055·2021-09-07 09:58
閱讀 1964·2019-08-30 15:55
閱讀 2142·2019-08-30 13:14