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
。
注意,採用這種寫法時,變數的宣告和賦值是一體的。對於let
和const
來說,變數不能重新宣告,所以一旦賦值的變數以前宣告過,就會報錯。
let foo;let = ; //
syntaxerror: duplicate declaration "foo"
let baz;
let = ; //
syntaxerror: duplicate declaration "baz"
上面**中,解構賦值的變數都會重新宣告,所以報錯了。不過,因為var
命令允許重新宣告,所以這個錯誤只會在使用let
和const
命令時出現。如果沒有第二個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重點 不是只有陣列才可以解構...