摘要:一概念對象是屬性的集合,從對象里取值,只能逐個取,而解構賦值表達式可以實現批量取值,賦值。賦值操作符等號兩邊的解構要一致才能正確賦值解構賦值表達式是賦值表達式的語法糖。三數組解構賦值數組的屬性名稱叫索引,表示的是位置。
一、概念
對象是屬性的集合,從對象里取值,ES3/5只能逐個取,而解構賦值表達式可以實現批量取值,賦值。
// 數據對象person var person = { name: "john", age: 22 } // ES5的方式: var name = person.name, age = person.age; // ES6解構賦值方式 var {name, age} = person;二、對象解構賦值 2.1 語法
// 格式1:聲明即賦值 var {key1: valName1=defaultVal1, key2: valName2=defaultVal2, ..., keyN: valNameN=defaultValN} = obj; // 格式2, 先聲明,后賦值。此時必須使用括號包裹整個賦值表達式 var valName1,valName2, ..., valNameN; ({key1: valName1=defaultVal1, key2: valName2=defaultVal2, ..., keyN: valNameN=defaultValN} = obj);
obj:表示數據源對象
key1:表示需要從數據源對象中取值的屬性名稱,如果和valName1同名,可以省略不寫;
valName1:表示需要把獲取的屬性值賦值給的模板變量,即valNam1=obj[key1];
defaultVal1:表示obj對象不包含屬性key1時指定的默認值,可選的。
所以用ES5的表示方式相當于:
var valName1 = obj[key1], valName2 = obj[key2], valNameN = obj[keyN];
如果key和valName的相同,可以簡寫為:
// 格式1:聲明即賦值 var {valName1=defaultVal1, valName2=defaultVal2, ..., valNameN=defaultValN} = obj; // 格式2, 先聲明,后賦值。此時括號是必須的 var valName1,valName2, ..., valNameN; ({valName1=defaultVal1, valName2=defaultVal2, ..., valNameN=defaultValN} = obj);
大部分場景都是使用簡寫的方式。
假設有個對象dad:
// Object var dad = { name: "john", age: 30, children: [ { name: "Tom", age: 2 }, { name: "Jim", age: 1 } ] }
現在要把dad屬性分別保存到變量name, age, children里:
// 格式1: 聲明即賦值 var {name:name, age:age, children:children} = dad; console.log(name); // john console.log(age); // 30 console.log(children.length); // 2 // 格式2, 先聲明,后賦值。此時括號是必須的,否則報語法錯誤 var name, age, children; ({name:name, age:age, children:children} = dad)
對應的簡寫格式:
// 格式1 var {name, age, children} = dad; // 格式2 var name, age, children; ({name, age, children} = dad)2.2 默認值
對于沒有匹配到 或者匹配到的屬性值為undefined的變量可以指定默認值。
dad.name = void 0; // dad定義見上例, var { weight = "66kg", name="new name"} = dad; // dad沒有定義weight屬性 console.log(weight, name); // weight="66kg", name="new name"2.3 動態屬性名稱
在上面的語法結構中
var {key1: valName1, key2: valName2, ..., keyN: valNameN} = obj;
其中key1,key2...keyN還可以是個變量,為了標識他們是變量而不是字面量,則需用用中括號包裹:
var key = "name"; var {[key]:val } = dad; console.log(val); // "john" key = "age"; ({[key]:val } = dad); console.log(val); // 302.4 小結
解構賦值的前提是同構,即左右兩邊的對象解構要一致;
對象解構賦值在綁定值時根據屬性key(key的名稱和結構位置)進行匹配的。賦值操作符(等號)兩邊的解構要一致才能正確賦值;
解構賦值表達式是賦值表達式的語法糖。
三、數組解構賦值數組的屬性名稱叫索引,表示的是位置。所以跟對象的解構賦值相比語法上有些不同:
3.1 語法// 語法格式1: 聲明即賦值 var arr = [1, 2, 3, 4, 5, 6]; var [f, s, t] = arr; // 語法格式2: 先聲明,后賦值 var a, b, c; [a, b, c] = arr; console.log([f, s, t]) // [1, 2, 3] console.log([a, b, c]) // [1, 2, 3]
數組解構賦值在綁定值時根據屬性下標和進行匹配的。賦值操作符(等號)兩邊的解構要一致才能正確賦值,如果匹配不成功則取值為undefined。
3.2 跳躍式的賦值var arr = [1, 2, 3]; var [,f,s] = arr; // f=2, s=33.3 獲取數組剩下的元素
通過rest操作符(...)修飾變量可以實現獲取數組剩下的元素:
var arr = [3, 4, 5, 6]; var [a, ...b] = arr; console.log(b); // [4,5,6]
變量b獲取數組arr剩余的元素,此時注意變量b必須放在最后,否則語法錯誤。如果沒有剩余的元素,則為空數組,
var arr = [3]; var [a, b, ...c] = arr; console.log(a) // 3 console.log(b) // undefined console.log(c) // []3.4 嵌套
// 獲取二維數組的元素 var [[a00=1], [,a11]] = [[1, 2], [3, 4]]; console.log(`a00=${a00}, a11=${a11}`) // 繼續上面的例子,現在的需求是把dad對象里第2個孩子的屬性保存到name,age變量里(這個寫法就復雜了,結合了數組解構賦值和對象解構賦值): var {children: [,{name, age}]} = dad; console.log([name, age])
注意: 復雜的嵌套降低了可讀性,需要權衡下是否要使用
3.5 數組也是對象數組本身也是對象,數組的賦值解構也可以通過對象解構賦值的方式表示:
var arr = [1, 2, 3]; var {0:f, 1:s, 2:t} = arr; // 等價 var [f, s, t] = arr; console.log([f, s, t]) // f=1, s=2, t=3
這樣寫確實麻煩哈,數組解構賦值是對數組對象解構賦值的的簡化。他們的賦值匹配模式本質上是一樣的。
四、對非對象的變量進行解構var {a } = 1, // undefined {b} = true, // undefined {c} = "a", // undefined rjzdjxl = null, // 類型錯誤 {e} = undefined; // 類型錯誤
JS對這些基本類型數字,字符串,boolean都定義了對應的對象類型,在對這些類型的數據進行解構賦值操作時,會轉成對應的對象類型。但是null, undefined卻沒有對應的對象類型,所有在運行時會報類型錯誤。
五、一些應用場景總結一句話: 只要是發生賦值操作的場景都可以使用解構賦值表達式。
5.1 函數參數解構賦值function log({title: tag = "Debug", message}) { console.log(`${tag}: ${message}`); } log({title: "Info", message: "This is a log message"})
要使用ES5實現上面的功能,大致如:
function log(option) { if(!option) option= {}; var tag = option.title || "Debug", message = option.message; console.log(`${tag}: ${message}`); } log({title: "Info", message: "This is a log message"})
解構賦值用作函數的形參使得參數更加直觀明了,并且可以賦值默認值。ES5的寫法得讀代碼才能看到具體需要什么參數。
5.2 for-of語句可以對集合元素進行解構操作,更方便循環體內取值。
for(var {name, age} of dad.children) { console.log(`name: ${name}, age: ${age}`) }5.3 函數返回值解構
// 方便正則取值 var url = "https://developer.mozilla.org/en-US/Web/JavaScript"; var parsedURL = /^(w+)://([^/]+)/(.*)$/.exec(url); console.log(parsedURL); var [, protocol, fullhost, fullpath] = parsedURL; console.log(protocol); // "https"參考
MDN Destructuring assignment
ES6 In Depth: Destructuring
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90284.html
摘要:解構是很重要的一個部分。解構代碼如下上面的代碼表示聲明兩個變量然后。實際業務中長方形的是不能沒有值的。都算正常值的范疇。解構進階解構時同時使用重命名和設置默認值的語法。若有,若沒有屬性,那么將賦值為。 Destructuring解構是ES6很重要的一個部分。和箭頭函數、let、const 同等地位,解構可能是你日常用到最多的語法之一了。解構是什么意思呢?它是js 表達式,允許我們從數組...
摘要:被解構的數據項位于賦值運算符的右側,可以是任何數組和對象的組合,允許隨意嵌套。數組模式位于賦值運算符的左側,被結構的數組在其右側。 解構是ES6的新特性,用于從JavaScript對象和數組中提取數據,語法上比ES5所提供的更加簡潔、緊湊、清晰。它不僅能減少你的代碼量,還能從根本上改變你的編碼方式。用的越多,你就會發現越多塑造數據和函數的方式,這些實現方式在過去幾乎是不可能的。本文將深...
一直以來,我對ES6都不甚感興趣,一是因為在生產環境中使用ES5已是處處碰壁,其次則是只當這ES6是語法糖不曾重視。只是最近學習react生態,用起babel來轉換jsx之余,也不免碰到諸多用上ES6的教程、案例,因此便稍作學習。這一學習,便覺得這語法糖實在是甜,忍不住嘗鮮,于是記錄部分自覺對自己有用的方法在此。 箭頭函數(Arrow Functions) 箭頭函數是一個典型的語法糖,即創造了一種...
摘要:在可遍歷的量中使用數組模型數組解構使用一個迭代器來獲取數據源中的元素。所以,數組解構能夠在上工作的迭代器總是按照元素插入的順序將元素返回,所以上述的解構返回的結果總是相同的。 解構賦值(destructuring assignment)語法是一個Javascript表達式,這種語法能夠更方便的提取出 Object 或者 Array 中的數據。這種語法可以在接受提取的數據的地方使用,比如...
摘要:只要某種數據結構具有接口,都可以采用數組形式的解構賦值。解構賦值允許指定默認值。默認值可以引用解構賦值的其他變量,但該變量必須已經聲明。解構也可以用于嵌套結構的對象。 Es6 新增了destructuring(解構)語法糖, 我們快來了解一下: 可以按照一定的模式從數組/對象中提取值,為變量賦值數組解構 var a = 1; var b = 2; var c = 3; 可以寫作: v...
閱讀 898·2019-08-30 15:54
閱讀 1466·2019-08-30 15:54
閱讀 2400·2019-08-29 16:25
閱讀 1292·2019-08-29 15:24
閱讀 749·2019-08-29 12:11
閱讀 2506·2019-08-26 10:43
閱讀 1227·2019-08-26 10:40
閱讀 466·2019-08-23 16:24