ES6之解構賦值

2021-10-22 16:35:05 字數 4218 閱讀 5916

按照一定模式從陣列和物件中提取值,然後對變數進行賦值,該操作即為解構。只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。

es6之前的賦值

let a =1;

let b =2;

let c =

3;

解構賦值:

let

[a, b, c]=[

1,2,

3];

解構賦值也可以進行巢狀、有所忽略、使用剩餘運算子賦、以及進行不完全解構

let

[a,[

[b], c]]=

[1,[

[2],

3]];

// a = 1,b = 2,c=3

let[a,

, b]=[

1,2,

3];// a = 1,b = 3

let[head,

...tail]=[

1,2,

3,4]

;//head = 1,tail = [2, 3, 4]

let[x, y,

...z]=[

'a']

;//x = "a",y = undefined,z =

如果解構不成功,變數的值就等於undefined

let

[foo]=[

];//foo = undefined

let[bar, foo]=[

1];//bar = 1,foo = undefined

在陣列的解構中,解構的目標若為可遍歷物件,皆可進行解構賦值。可遍歷物件即實現 iterator 介面的資料。

let

[a, b, c, d, e]

='hello'

;// a = 'h',b = 'e',c = 'l',d = 'l',e = 'o'

當解構模式有匹配結果,且匹配結果是 undefined 時,會觸發預設值作為返回結果。

let

[a =2]

=[undefined]

;// a = 2

let[a =

3, b = a]=[

];// a = 3, b = 3

let[a =

3, b = a]=[

1];// a = 1, b = 1

let[a = b, b =1]

=;// referenceerror: b is not defined

上面最後乙個表示式之所以會報錯,是因為a用b做預設值時,b還沒有宣告

如果預設值是乙個表示式,會採用惰性求值,只有在用到時才會求值

functionf(

)let

[x =f(

)]=[

1];//x = 1

沒有變數接收的解構值會被忽略掉,如果賦值不是陣列則會報錯

let

[a,[b]

, d]=[

1,[2

,3],

4];//a = 1,b = 2,d = 4

let[foo]=1

;//1 is not iterable

物件的解構賦值與陣列不同,陣列的元素是按次序排列的,變數的取值是由它的位置決定。物件的屬性沒有次序,變數必須與屬性同名才能取到正確的值。如果解構失敗,變數的值等於undefined。

let=;

//foo = "aaa",bar = "bbb"

let=

;//baz = undefined

如果變數名與屬性名不一致,必須明確對應關係

物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。

let=;

//baz = undefined

let=

;//baz = 'aaa' , foo is not defined

與陣列一樣,解構也可以用於巢狀結構的物件。

let obj =]}

;let]}

= obj;

//x = "hello",y = "world"

注意,這時p是模式,不是變數,因此不會被賦值。

let obj =

;let arr =

;(=)

;//obj = ,arr = [true]

如果解構模式是巢狀的物件,而且子物件所在的父屬性不存在,那麼將會報錯

let}=

;//cannot read property 'bar' of undefined

上面**中,等號左邊物件的foo屬性,對應乙個子物件。該子物件的bar屬性,解構時會報錯。原因很簡單,因為foo這時等於undefined,再取子屬性就會報錯。

物件的解構也可以指定預設值,預設值生效的條件是,物件的屬性值嚴格等於undefined

var=;

//x = 3

var=

;//x = 1,y = 5

var=

;//y = 3

var=

;//y = 5

var=

;//msg = "something went wrong"

字串也可以解構賦值。這是因為此時,字串被轉換成了乙個類似陣列的物件

let

[a, b, c, d, e]

='hello'

;// a = 'h',b = 'e',c = 'l',d = 'l',e = 'o'

類似陣列的物件都有乙個length屬性,因此還可以對這個屬性解構賦值。

let

='hello'

;//len = 5

解構賦值時,如果等號右邊是數值和布林值,則會先轉為物件。由於undefined和null無法轉為物件,所以對它們進行解構賦值,都會報錯

let

=123

;s === number.prototype.tostring // true

let=

true

;s === boolean.prototype.tostring // true

let= undefined;

// typeerror

let=

null

;// typeerror

函式呼叫時,會將實參傳遞給形參,其過程就是實參賦值給形參。因此,也可以使用解構賦值。

其規則與陣列、物件的解構賦值一致,關鍵看引數是採用哪種解構賦值方式。

function

add(

[x, y =10]

)let r =

add([1

]);//r = 11

function

add(

)let r =

add();

//r = 30

(1)交換變數的值

let x =1;

let y =2;

[x, y]

=[y, x]

;

(2)從函式返回多個值

function

example()

let[a, b, c]

=example()

;

(3)函式引數的定義

解構賦值可以方便地將一組引數與變數名對應起來

// 引數是一組有次序的值

functionf(

[x, y, z])f

([1,

2,3]

);// 引數是一組無次序的值

functionf(

)f()

;

(4)提取 json 資料

let jsondata =

;let

= jsondata;

console.

log(id, status, number)

;// 42, "ok", [867, 5309]

ES6之 解構賦值

es6允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構賦值 destructuring 也可以簡稱 解構。下面用 進一步解釋一下什麼叫解構賦值。1.關於給變數賦值,傳統的變數賦值是這樣的 var arr 1,2,3 把陣列的值分別賦給下面的變數 var a arr 0 var b...

ES6之解構賦值

1.es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 let a,b,c 1,2 3 2.如果等號的右邊不是陣列 或者嚴格地說,不是可遍歷的結構,參見 iterator 一章 那麼將會報錯。如下例 let foo 1 let foo false let foo nan l...

ES6之解構賦值

es6允許按照一定模式從陣列和物件中提取值,對變數進行賦值 稱為解構賦值 const aaa 張三 李四 王二 麻子 let zhang,li,wang,ma aaa console.log zhang 張三 console.log li 李四 console.log wang 王二 console...