es6 允許按照一定模式, 從陣列和物件中提取值, 對變數進行賦值, 這被稱為解構(destructruing)基本用法
let
[foo,
[[bar]
, baz]]=
[1,[
[2],
3]];
//foo - 1 bar - 2 baz - 3
let[x,
,y]=[1
,2,3
];//x - 2 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 -
預設值
let
[a =1]
=[]a // 1
let[a, b =2]
=[1]
;// a=1, b=2
let[a, b =2]
=[1, undefined]
;// a=1, b=2
基本用法
物件的解構與陣列的解構不同, 陣列的元素是按次序排列的, 變數的取值是由它的位置決定的; 而物件的屬性沒有次序, 變數必須與屬性同名, 才能取到正確的值. 如果解構失敗, 變數的值變為undefined.
let=;
a // 1
b // 2
c // undefined
//將math物件的對數,正弦,余弦三個方法, 賦值到對應的變數上
let= math
//將console.log賦值到log變數
let= console;
log(
'hello'
)// hello
let obj =
;let
= obj
c // 1
d // 2
這說明了, 物件的解構賦值是下邊的簡寫
let
=
也就是說, 物件的解構賦值的內部機制, 是先找到同名屬性, 然後再賦值給對應的變數, 真正被賦值的是後者, 而不是前者.
let obj =]}
;let]}
= obj
x // hello
y // world
let obj =]}
;let]}
= obj
x // hello
y // world
p // ['hello', ]
const node =}}
;let
, loc:}}
= node;
line //1
start //object
loc //object
最後一次對line屬性的解構賦值之中, 只用line是變數, loc和start都是模式不是變數.
let obj =
;let arr =
;(=)
;obj //
arr // [true]
預設值
var=;
x // 1
y // 5
var=
;y // 3
var=
;y // 5
預設值生效的條件是, 物件的屬性值嚴格等於undefined
注意點(1) 如果要將乙個已經宣告的變數用於解構賦值, 必須非常小心.
//錯誤寫法
let x;=;
//正確寫法
let x;(=
);
(2) 解構賦值允許等號左邊的模式之中, 不放置任何變數名.
(3) 由於陣列本質是特殊的物件, 因此可以對陣列進行物件屬性的解構
let arr =[1
,2,3
];let= arr;
first // 1
last // 3
字串被解構賦值時, 被轉換成了乙個類似陣列的物件
const
[a,b,c,d,e]
='hello'
a // h
b // e
c // l
d // l
e // o
類似陣列的物件都有乙個length屬性, 因此還可以對這個屬性解構賦值
let
='hello'
len // 5
解構賦值時, 如果等號右邊是不數值和布林值, 則會先轉為物件
let
=123
s === number.prototype.tostring // true
let=
true
;s === boolean.prototype.tostring // true
解構賦值時, 由於undefined和null無法轉為物件, 所以對他們進行解構賦值都會報錯.
例子
function
add(
[x,y]
)add([
1,2]
);//3[[1
,2],
[3,4
]].map((
[a,b]
)=> a + b)
;//[3,7]
以下三種解構賦值不得使用圓括號:
變數宣告語句
let
[(a)]=
[1]
函式引數
functionf(
[(z)])
賦值語句的模式
(
[a])=[
5];
可以使用圓括號的情況
[
(b)]=[
3];(
=);[
(parseint.prop)]=
[3];
交換變數的值
let x =
1let y =
2[x,y]
=[y,x]
從函式返回多個值
函式只能返回乙個值, 如果要返回多個值, 只能將他們放在陣列或物件裡返回.
//返回乙個陣列
functionf(
)let
[a,b,c]=f
();//返回乙個物件
functionf(
);}let=f
();
函式引數的定義
functionf(
[x, y, z])f
([1,
2,3]
);
提取json資料
let jsondata =
;let
= jsondata;
console.
log(id, status, number)
;// 42, "ok", [867, 5309]
函式引數的預設值
jquery.
ajax
=function
(url,
, cache =
true
,complete
=function()
, crossdomain =
false
, global =
true
,// ... more config}=
);
遍歷map結構
const map =
newmap()
;map.
set(
'first'
,'hello');
map.
set(
'second'
,'world');
for(
let[key, value]
of map)
// first is hello
// second is world
如果只想獲取鍵名, 或者只想獲取鍵值
//獲取鍵名
for(
let[key]
of map)
//獲取鍵值
for(
let[
,value]
of map)
輸入模組的指定方法
載入模組時,往往需要指定輸入哪些方法。解構賦值使得輸入語句非常清晰。
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 ...
變數的解構賦值
什麼是解構 es6允許按照一定的模式,從陣列或者物件中提取值,然後賦值給相應變數,此為解構。解構分為完全解構和不完全解構,前者要求一一對應,後者可以是等號左邊只匹配等號右邊的一部分。解構不成功會返回undefined。let foo alert foo undefined重點 不是只有陣列才可以解構...