本文是在看完阮一峯老師的著作只會所總結的~~~~
給阮老師致敬,同時也可以去阮老師的的書裏看
http://es6.ruanyifeng.com/#docs/let
另外若要看如何使用搭配es6環境,請翻閱我以前的博客~~~
所謂解構賦值:ES6允許按照一定模式,從數組和對象中提取值,對變量進行賦值。
主要分爲幾類情況,下面一一來介紹:
一.數組的解構賦值:
數組的解構賦值其實就是一個匹配模式問題,左右兩邊的相互對應,符號對應符號,變量對應變量值就行。還是得提醒一個問題,所有用let定義的均不能重複聲明。
var [a,b,c]=[1,2,3];
let [foo,[[bar],baz]]=[1,[[2],3]];
console.log(foo); //1
console.log(bar); //2
console.log(baz); //3
傳統的做法是單獨聲明和賦值每一個變量:
而這也不是真正意義上的數組。
而這種解構賦值方式可以嵌套數組,只是得遵循“匹配模式".
var value = [1, 2, [3, 4,5]];
var [el1, el2, [el3, el4]] =value;
console.log(value); // [ 1, 2, [ 3, 4, 5 ] ]
console.log([el1, el2, [el3,el4]] ); // [ 1,2, [ 3, 4 ] ]
但是也存在下面兩種情況:
1.解構不成功
let [x, y, ...z] = ['a'];
console.log(x); //a
console.log(y); //undefined
console.log(z); //[]
這種屬於左邊的變量多餘右邊的變量值,造成匹配不上。而會輸出undefined。
2.不完全解構
let [o, r] = [1, 2, 3];
console.log(o); //1
console.log(r); //2
這種屬於左邊的變量少於右邊的變量值,造成解構不完全,輸出結果會成功,但是就是遵循從左到右,一個變量對應一個值的形式,多餘的變量值直接廢棄掉。
默認值同樣也能被指定:
var[firstName="John",lastName="Doe"]=[];
console.log(firstName);
對於set解構同樣也可以用解構賦值:
let [x,y,z]=new set([“a”,”b”,”c”])
二.對象的解構賦值:
解構不僅可以用於數組,也可以用於對象。
數組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
var {f,b}={f:"aaa",b:"bbb"};
console.log(f);//aaa
console.log(b);//bbb
var {baz}={foo:”aaa”,bar:”bbb”};
console.log(baz);
ES6允許變量名與對應的屬性名不一致
var person={firstName:"John",lastName:"Doe"};
var {firstName: name,lastName} = person;
console.log(name);
也就是person.firstName的值會直接賦給name.
也可以深層嵌套對象,也不會有問題;
var person = {name:{firstName: "John", lastName: "Doe"}};
這樣也行
var person = [{dateOfBirth: [1, 1, 1980]}];
var [{dateOfBirth}] = person;
console.log(dateOfBirth);// [ 1, 1, 1980]
同樣的也能和數組一樣指定默認值:
var {firstName = "John", lastName: userLastName = "Doe"} = {};
console.log(firstName);//John
但是
var {firstName = "John", lastName = "Doe"} = {firstName: null, lastName: null};
console.log(firstName);//null
console.log(lastName)//null
字符串的解構賦值:
字符串也可以解構賦值。只是將會被轉化成類似於數組的對象。
const[a,b,c,d,e]=”hello”;
類似數組就有一些像length屬性的,也可以用來解構賦值。
let {length : len} = 'hello';
console.log(len); //5
數值和布爾值的解構賦值都是先轉化爲對象。因爲數值和布爾值都有tostring屬性。和上文的length用法類似。
像null,undefined不能轉化爲字符串的則會報錯.
函數參數的解構賦值:
functionadd([x,y]){
return x+y;
}
console.log(add([1,2])); //3
函數add的參數表面上是一個數組,但在傳入參數的那一刻,數組參數就被解構成變量x和y。
但其實按照老方法這樣寫就好呀。
functionadd(x,y){
return x+y;
}
console.log(add(1,2));//3
在說明一點:解構賦值雖然有其方便之處,但是對於編譯器要去解讀它比較麻煩,所以請儘量少使用圓括號。
其實如果用你以前的方法能解決的就解決。
說幾點不需要使用圓括號的情況:
(1)變量聲明中不能帶有圓括號。
var [(a)]=[1] //報錯;
(2)函數參數模式也是屬於變量聲明的,因此不能帶有圓括號。
function f([(z)]) { return z'}
(3) 賦值語句中,不能將整個模式,或嵌套模式中的一層,放在圓括號中。
({p:a})={p:42};
(4)嵌套模式中將嵌套模式的一層放入圓括號也是報錯的。
[({p:a}),{x:c}]=[{},{}];
而我們的賦值語句是可以帶圓括號的。
扯了這麼多,來說說解構賦值到底有如何用。
(1)交換變量的值。
[x,y]=[y,x];
(2) 從函數返回多個值。 一般函數只能返回一個值,若要返回多個值,只能將它們放在數組或者對象裏返回。而解構賦值對於取出這些值很方便。
取出一個數組值:
function example(){
return [1,2,3];
}
var [a,b,c]=example();
console.log(a); //1
console.log(b); //2
console.log(c); //3
取出一個對象值:
function example() {
return {
foo: 1,
bar: 2
};
}
var { foo, bar } = example();
console.log(foo); //1
console.log(bar); //2
(3)函數參數的定義
解構函數可以很方便的將一組參數和變量名對應起來。
function f([x,y,z]){...};
f([1,2,3]);
(4)提取json數據。
var jsonData={
id:42,
status:"OK",
data:[867,534]
};
let {id,status,data:number}=jsonData;
console.log(id,status,number); //42 'OK' [ 867, 534 ]
(5)指定函數參數默認值。
(6)遍歷map解構。
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
(7)輸入模塊的指定方法,使得語句變得清晰
const {SourceMapConsumer,Sourcenode}=require{"source-map"};