3 變數的解構賦值

2022-05-03 07:36:10 字數 2776 閱讀 7723

1.陣列的解構賦值

let [foo, [[bar], baz]] = [1, [[2], 3]];

foo //1

bar //

2baz //

3let [ , , third] = ["foo", "bar", "baz"];

third

//"baz"

let [x, , y] = [1, 2, 3];

x //

1y //

3let [head, ...tail] = [1, 2, 3, 4];

head //1

tail //

[2, 3, 4]

let [x, y, ...z] = ['a'];

x //

"a"y //

undefined

z //

預設值

let [foo = true] =;

foo

//true

let [x, y = 'b'] = ['a']; //

x='a', y='b'

let [x, y = 'b'] = ['a', undefined]; //

x='a', y='b'

注意,es6 內部使用嚴格相等運算子(===),判斷乙個位置是否有值。所以,如果乙個陣列成員不嚴格等於undefined,預設值是不會生效的。

let [x = 1] =[undefined];

x //

1let [x = 1] = [null

];x

//null

上面**中,如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined

2.物件的解構賦值

物件的解構與陣列有乙個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。

let  = ;

foo

//"aaa"

bar //

"bbb"

let = ;

baz

//undefined

上面**的第乙個例子,等號左邊的兩個變數的次序,與等號右邊兩個同名屬性的次序不一致,但是對取值完全沒有影響。第二個例子的變數沒有對應的同名屬性,導致取不到值,最後等於undefined

如果變數名與屬性名不一致,必須寫成下面這樣。

var  = ;

baz

//"aaa"

let obj = ;

let =obj;

f //

'hello'

l //

'world'

這實際上說明,物件的解構賦值是下面形式的簡寫

let  = ;

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

let  = ;

baz

//"aaa"

foo //

error: foo is not defined

上面**中,foo是匹配的模式,baz才是變數。真正被賦值的是變數baz,而不是模式foo

注意,採用這種寫法時,變數的宣告和賦值是一體的。對於letconst來說,變數不能重新宣告,所以一旦賦值的變數以前宣告過,就會報錯。

let foo;

let = ; //

syntaxerror: duplicate declaration "foo"

let baz;

let = ; //

syntaxerror: duplicate declaration "baz"

上面**中,解構賦值的變數都會重新宣告,所以報錯了。不過,因為var命令允許重新宣告,所以這個錯誤只會在使用letconst命令時出現。如果沒有第二個let命令,上面的**就不會報錯

let foo;

( = ); //

成功let baz;

( = ); //

成功

上面**中,let命令下面一行的圓括號是必須的,否則會報錯。因為解析器會將起首的大括號,理解成乙個**塊,而不是賦值語句。

3.字串的解構賦值

const [a, b, c, d, e] = 'hello';

a //

"h"b //

"e"c //

"l"d //

"l"e //

"o"

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

let  = 'hello';

len

//5

4.數值和布林值的解構賦值

5.函式引數的解構賦值

6.圓括號問題

es6的規則是,只要有可能導致解構的歧義,就不得使用圓括號。

7.用途

變數解構賦值

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

變數的解構賦值

從陣列和物件中提取值,對變數進行賦值,這被稱為解構 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值 例子 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 ...

變數的解構賦值

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