變數的解構賦值

2021-09-19 04:32:11 字數 3891 閱讀 4532

從陣列和物件中提取值,對變數進行賦值,這被稱為解構

本質上,這種寫法屬於「模式匹配」,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值

例子:

let

[a, b, c]=[

1,2,

3];let

[foo,

[[bar]

, baz]]=

[1,[

[2],

3]];

foo // 1

bar // 2

baz // 3

let[

,, third]=[

"foo"

,"bar"

,"baz"];

third // "baz"

let[x,

, y]=[

1,2,

3];x // 1

y // 3

let[head,

...tail]=[

1,2,

3,4]

;head // 1

tail // [2, 3, 4]

let[x, y,

...z]=[

'a']

;x // "a"

y // undefined

z //

若解構失敗,變數的值則等於underfined

let

[foo]=[

];let[bar, foo]=[

1];// underfined

不完全解構

let

[x, y]=[

1,2,

3];x // 1

y // 2

let[a,

[b], d]=[

1,[2

,3],

4];a // 1

b // 2

d // 4

若等號右邊不是陣列,則會報錯

// 報錯

let[foo]=1

;let

[foo]

=false

;let

[foo]

=nan

;let

[foo]

= undefined;

let[foo]

=null

;let

[foo]=;

//因為 iterator 介面問題(後幾章討論)

解構賦值允許指定預設值,不過對於預設值是underfined,需要在嚴格模式下才會生效該預設值

let

[x =1]

=[undefined]

;x // 1

let[x =1]

=[null];

x // null

若預設值為 f ( ) 函式 ,則該函式只有在被取值到的時候才會解析

let

[x =f(

)]=[

1];let x;if(

[1]=== undefined)

else

預設值可以引用解構賦值的其他變數,但是該變數必須已經宣告

let=;

foo // "aaa"

bar // "bbb" //找到同名就賦值

若找不到同名值,則最後等於underfined

let=;

foo // undefined

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

let=;

baz // "aaa"

foo // error: foo is not defined //foo是匹配模式,不賦值

解構用於巢狀結構的物件

let obj =]}

;let]}

= obj;

//p為模式,不能被複製

x // "hello"

y // "world"

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

var=;

x // 3

var=

;x // 1

y // 5

var=

;y // 3

var=

;y // 5

var=

;x // 3

var=

;x // null

不能將寫在行首,系統會解析為**塊

// 錯誤的寫法

let x;=;

// syntaxerror: syntax error

// 正確的寫法

let x;(=

);

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

const

[a, b, c, d, e]

='hello'

;a // "h"

b // "e"

c // "l"

d // "l"

e // "o"

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

let

='hello'

;len // 5

解構賦值時,如果等號右邊是數值和布林值,則會先轉為物件

函式的引數也可以使用解構賦值

function

add(

[x, y]

)add([

1,2]

);// 3

函式的引數也可以賦預設值

function

move(=

)move()

;// [3, 8]

move()

;// [3, 0]

move()

;// [0, 0]

move()

;// [0, 0]

可以使用圓括號的情況:

[

(b)]=[

3];// 正確(=

);// 正確

[(parseint.prop)]=

[3];

// 正確

let x =1;

let y =2;

[x, y]

=[y, x]

;

function

example()

let[a, b, c]

=example()

;[a,b,c]

//[1,2,3]

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

functionf(

[x, y, z])f

([1,

2,3]

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

functionf(

)f()

;

變數解構賦值

1.從陣列物件中提取值,對變數進行賦值,被稱為結構。2.false,1,nan undefind null轉化為物件後不具備iterator介面,本身不具備iterator介面。3.set結構也可使用陣列的解構賦值,只需要資料機構具備iterator 迭代器 介面,都可以採用陣列形式的解構賦值 ar...

變數的解構賦值

什麼是解構 es6允許按照一定的模式,從陣列或者物件中提取值,然後賦值給相應變數,此為解構。解構分為完全解構和不完全解構,前者要求一一對應,後者可以是等號左邊只匹配等號右邊的一部分。解構不成功會返回undefined。let foo alert foo undefined重點 不是只有陣列才可以解構...

變數的解構賦值

1 變數的解構賦值 let a,b,c 1,2,3 上面 表示,可以從陣列中提取值,按照對應位置,對變數賦值。注意 es6 內部使用嚴格相等運算子 判斷乙個位置是否有值。所以,只有當乙個陣列成員嚴格等於undefined,預設值才會生效。2 物件的解構賦值 解構不僅可以用於陣列,還可以用於物件。le...