国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6: 解構(gòu)賦值(Destructuring)

CODING / 1884人閱讀

摘要:一概念對象是屬性的集合,從對象里取值,只能逐個取,而解構(gòu)賦值表達式可以實現(xiàn)批量取值,賦值。賦值操作符等號兩邊的解構(gòu)要一致才能正確賦值解構(gòu)賦值表達式是賦值表達式的語法糖。三數(shù)組解構(gòu)賦值數(shù)組的屬性名稱叫索引,表示的是位置。

一、概念

對象是屬性的集合,從對象里取值,ES3/5只能逐個取,而解構(gòu)賦值表達式可以實現(xiàn)批量取值,賦值。

// 數(shù)據(jù)對象person 
var person = {
    name: "john",
    age: 22
}

// ES5的方式:
var name = person.name,
    age = person.age;
    
// ES6解構(gòu)賦值方式
var {name, age} = person;
二、對象解構(gòu)賦值 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:表示數(shù)據(jù)源對象

key1:表示需要從數(shù)據(jù)源對象中取值的屬性名稱,如果和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);

大部分場景都是使用簡寫的方式。

假設(shè)有個對象dad:

// Object
var dad = {
    name: "john",
    age: 30,
    children: [
        {
            name: "Tom",
            age: 2
        },
        {
            name: "Jim",
            age: 1
        }
    ]
}

現(xiàn)在要把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)

對應(yīng)的簡寫格式:

// 格式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 動態(tài)屬性名稱

在上面的語法結(jié)構(gòu)中

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); // 30
2.4 小結(jié)

解構(gòu)賦值的前提是同構(gòu),即左右兩邊的對象解構(gòu)要一致;

對象解構(gòu)賦值在綁定值時根據(jù)屬性key(key的名稱和結(jié)構(gòu)位置)進行匹配的。賦值操作符(等號)兩邊的解構(gòu)要一致才能正確賦值;

解構(gòu)賦值表達式是賦值表達式的語法糖。

三、數(shù)組解構(gòu)賦值

數(shù)組的屬性名稱叫索引,表示的是位置。所以跟對象的解構(gòu)賦值相比語法上有些不同:

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]

數(shù)組解構(gòu)賦值在綁定值時根據(jù)屬性下標和進行匹配的。賦值操作符(等號)兩邊的解構(gòu)要一致才能正確賦值,如果匹配不成功則取值為undefined。

3.2 跳躍式的賦值
var arr = [1, 2, 3];
var [,f,s] = arr; // f=2, s=3
3.3 獲取數(shù)組剩下的元素

通過rest操作符(...)修飾變量可以實現(xiàn)獲取數(shù)組剩下的元素:

var arr = [3, 4, 5, 6];
var [a, ...b] = arr;
console.log(b); // [4,5,6]

變量b獲取數(shù)組arr剩余的元素,此時注意變量b必須放在最后,否則語法錯誤。如果沒有剩余的元素,則為空數(shù)組,

var arr = [3];
var [a, b, ...c] = arr;
console.log(a) // 3
console.log(b) // undefined
console.log(c) // []
3.4 嵌套
// 獲取二維數(shù)組的元素
var [[a00=1], [,a11]] = [[1, 2], [3, 4]];
console.log(`a00=${a00}, a11=${a11}`)

// 繼續(xù)上面的例子,現(xiàn)在的需求是把dad對象里第2個孩子的屬性保存到name,age變量里(這個寫法就復(fù)雜了,結(jié)合了數(shù)組解構(gòu)賦值和對象解構(gòu)賦值):
var {children: [,{name, age}]} = dad;
console.log([name, age])

注意: 復(fù)雜的嵌套降低了可讀性,需要權(quán)衡下是否要使用

3.5 數(shù)組也是對象

數(shù)組本身也是對象,數(shù)組的賦值解構(gòu)也可以通過對象解構(gòu)賦值的方式表示:

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

這樣寫確實麻煩哈,數(shù)組解構(gòu)賦值是對數(shù)組對象解構(gòu)賦值的的簡化。他們的賦值匹配模式本質(zhì)上是一樣的

四、對非對象的變量進行解構(gòu)
var {a } = 1, // undefined
    {b} = true, // undefined
    {c} = "a", // undefined
    uwgouyq = null, // 類型錯誤
    {e} = undefined; // 類型錯誤

JS對這些基本類型數(shù)字,字符串,boolean都定義了對應(yīng)的對象類型,在對這些類型的數(shù)據(jù)進行解構(gòu)賦值操作時,會轉(zhuǎn)成對應(yīng)的對象類型。但是null, undefined卻沒有對應(yīng)的對象類型,所有在運行時會報類型錯誤。

五、一些應(yīng)用場景

總結(jié)一句話: 只要是發(fā)生賦值操作的場景都可以使用解構(gòu)賦值表達式。

5.1 函數(shù)參數(shù)解構(gòu)賦值
function log({title: tag = "Debug", message}) {
    console.log(`${tag}: ${message}`);
}

log({title: "Info", message: "This is a log message"})

要使用ES5實現(xiàn)上面的功能,大致如:

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"})

解構(gòu)賦值用作函數(shù)的形參使得參數(shù)更加直觀明了,并且可以賦值默認值。ES5的寫法得讀代碼才能看到具體需要什么參數(shù)。

5.2 for-of語句

可以對集合元素進行解構(gòu)操作,更方便循環(huán)體內(nèi)取值。

for(var {name, age} of dad.children) {
    console.log(`name: ${name}, age: ${age}`)
}
5.3 函數(shù)返回值解構(gòu)
// 方便正則取值
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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90284.html

相關(guān)文章

  • ES6系列文章 Destructuring

    摘要:解構(gòu)是很重要的一個部分。解構(gòu)代碼如下上面的代碼表示聲明兩個變量然后。實際業(yè)務(wù)中長方形的是不能沒有值的。都算正常值的范疇。解構(gòu)進階解構(gòu)時同時使用重命名和設(shè)置默認值的語法。若有,若沒有屬性,那么將賦值為。 Destructuring解構(gòu)是ES6很重要的一個部分。和箭頭函數(shù)、let、const 同等地位,解構(gòu)可能是你日常用到最多的語法之一了。解構(gòu)是什么意思呢?它是js 表達式,允許我們從數(shù)組...

    JiaXinYi 評論0 收藏0
  • [譯] 最深刻而易懂的ES6解構(gòu)教程

    摘要:被解構(gòu)的數(shù)據(jù)項位于賦值運算符的右側(cè),可以是任何數(shù)組和對象的組合,允許隨意嵌套。數(shù)組模式位于賦值運算符的左側(cè),被結(jié)構(gòu)的數(shù)組在其右側(cè)。 解構(gòu)是ES6的新特性,用于從JavaScript對象和數(shù)組中提取數(shù)據(jù),語法上比ES5所提供的更加簡潔、緊湊、清晰。它不僅能減少你的代碼量,還能從根本上改變你的編碼方式。用的越多,你就會發(fā)現(xiàn)越多塑造數(shù)據(jù)和函數(shù)的方式,這些實現(xiàn)方式在過去幾乎是不可能的。本文將深...

    AlphaGooo 評論0 收藏0
  • ES6部分方法點評(一)

    一直以來,我對ES6都不甚感興趣,一是因為在生產(chǎn)環(huán)境中使用ES5已是處處碰壁,其次則是只當這ES6是語法糖不曾重視。只是最近學習react生態(tài),用起babel來轉(zhuǎn)換jsx之余,也不免碰到諸多用上ES6的教程、案例,因此便稍作學習。這一學習,便覺得這語法糖實在是甜,忍不住嘗鮮,于是記錄部分自覺對自己有用的方法在此。 箭頭函數(shù)(Arrow Functions) 箭頭函數(shù)是一個典型的語法糖,即創(chuàng)造了一種...

    weakish 評論0 收藏0
  • 深入理解 ES6解構(gòu)賦值

    摘要:在可遍歷的量中使用數(shù)組模型數(shù)組解構(gòu)使用一個迭代器來獲取數(shù)據(jù)源中的元素。所以,數(shù)組解構(gòu)能夠在上工作的迭代器總是按照元素插入的順序?qū)⒃胤祷兀陨鲜龅慕鈽?gòu)返回的結(jié)果總是相同的。 解構(gòu)賦值(destructuring assignment)語法是一個Javascript表達式,這種語法能夠更方便的提取出 Object 或者 Array 中的數(shù)據(jù)。這種語法可以在接受提取的數(shù)據(jù)的地方使用,比如...

    only_do 評論0 收藏0
  • es6 解構(gòu)筆記分享

    摘要:只要某種數(shù)據(jù)結(jié)構(gòu)具有接口,都可以采用數(shù)組形式的解構(gòu)賦值。解構(gòu)賦值允許指定默認值。默認值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明。解構(gòu)也可以用于嵌套結(jié)構(gòu)的對象。 Es6 新增了destructuring(解構(gòu))語法糖, 我們快來了解一下: 可以按照一定的模式從數(shù)組/對象中提取值,為變量賦值數(shù)組解構(gòu) var a = 1; var b = 2; var c = 3; 可以寫作: v...

    Hancock_Xu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<