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

資訊專欄INFORMATION COLUMN

ES6: 解構賦值(Destructuring)

CODING / 1878人閱讀

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

一、概念

對象是屬性的集合,從對象里取值,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); // 30
2.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=3
3.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

相關文章

  • ES6系列文章 Destructuring

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

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

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

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

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

    weakish 評論0 收藏0
  • 深入理解 ES6解構賦值

    摘要:在可遍歷的量中使用數組模型數組解構使用一個迭代器來獲取數據源中的元素。所以,數組解構能夠在上工作的迭代器總是按照元素插入的順序將元素返回,所以上述的解構返回的結果總是相同的。 解構賦值(destructuring assignment)語法是一個Javascript表達式,這種語法能夠更方便的提取出 Object 或者 Array 中的數據。這種語法可以在接受提取的數據的地方使用,比如...

    only_do 評論0 收藏0
  • es6 解構筆記分享

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

    Hancock_Xu 評論0 收藏0

發表評論

0條評論

CODING

|高級講師

TA的文章

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