什麼是解構:es6允許按照一定的模式,從陣列或者物件中提取值,然後賦值給相應變數,此為解構。
解構分為完全解構和不完全解構,前者要求一一對應,後者可以是等號左邊只匹配等號右邊的一部分。解構不成功會返回undefined。
let
[foo]=[
];alert
(foo)
;// undefined
重點:不是只有陣列才可以解構賦值,只要某種資料結構具有 iterator 介面,都可以採用陣列形式的解構賦值。
function
*fibs()
}let
[first, second, third, fourth, fifth, sixth]
=fibs()
;sixth // 5
fibs是乙個generator函式(生成器)
預設值
上面**中,如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined。
let
[x =1]
=[undefined]
;x // 1
let[x =1]
=[null];
x // null
預設值還可以是乙個表示式,表示式只有用到的時候才會求值
functionf(
)let
[x =f(
)]=[
1];
預設值可以引用解構賦值的其他變數,但該變數必須已經宣告。
let
[x =
1, y = x]=[
];// x=1; y=1
let[x =
1, y = x]=[
2];// x=2; y=2
let[x =
1, y = x]=[
1,2]
;// x=1; y=2
let[x = y, y =1]
=;// referenceerror: y is not defined
物件的解構賦值和陣列的不同之處在於物件是根據key-value查詢key值來賦值的,和順序沒關係。如果解構失敗返回undefined。
// 例一
let= math;
// 例二
const
= console;
log(
'hello'
)// hello
上面**的例一將math物件的對數、正弦、余弦三個方法,賦值到對應的變數上,使用起來就會方便很多。例二將console.log賦值到log變數。
let obj =
;let
= obj;
alert
(f+l)
;//helloworld
let=
;alert
(baz)
;// aaa
物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。前者是模式,後者才是變數。
設定繼承關係,obj1繼承自obj2
const obj1 =
;const obj2 =
;object.
setprototypeof
(obj1,obj2)
;const
= obj1;
alert
(foo)
;
字串的解構賦值會被轉換成乙個類似陣列的物件。其有乙個length屬性。
const
[a,b,c,d,e]
='hello'
;alert
(a);
let=
'hello'
;alert
(len)
;
解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件。
let
=123
;s === number.prototype.tostring // true
let=
true
;s === boolean.prototype.tostring // true
函式的引數可以使用陣列,也可以是物件。引數可以使用預設值。
陣列:
function
add(
[x, y]
)add([
1,2]
);// 3
物件:
為變數指定預設值
function
move(=
)move()
;// [3, 8]
move()
;// [3, 0]
move()
;// [0, 0]
move()
;// [0, 0]
為引數指定預設值
function
move(=
)move()
;// [3, 8]
move()
;// [3, undefined]
move()
;// [undefined, undefined]
move()
;// [0, 0]
可以使用圓括號的情況只有一種:賦值語句的非模式部分,可以使用圓括號。
[
(b)]=[
3];// 正確(=
);// 正確
[(parseint.prop)]=
[3];
// 正確
上面三行語句都可以正確執行,因為首先它們都是賦值語句,而不是宣告語句;其次它們的圓括號都不屬於模式的一部分。第一行語句中,模式是取陣列的第乙個成員,跟圓括號無關;第二行語句中,模式是p,而不是d;第三行語句與第一行語句的性質一致。
主要是針對陣列,物件的解構賦值進行應用,比如:
1.交換變數的值
2.從函式返回多個值
3.向函式傳參
4.提取json資料
5.函式引數的預設值
6.遍歷map解構
7.輸入模組的指定方法
const
=require
("source-map"
);
變數解構賦值
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 ...
變數的解構賦值
1 變數的解構賦值 let a,b,c 1,2,3 上面 表示,可以從陣列中提取值,按照對應位置,對變數賦值。注意 es6 內部使用嚴格相等運算子 判斷乙個位置是否有值。所以,只有當乙個陣列成員嚴格等於undefined,預設值才會生效。2 物件的解構賦值 解構不僅可以用於陣列,還可以用於物件。le...