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