ECMAScript6.0學習之第四篇變量的解構賦值

本文是在看完阮一峯老師的著作只會所總結的~~~~

給阮老師致敬,同時也可以去阮老師的的書裏看 

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 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"};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章