[譯]JavaScript ES6解構賦值指南

前言

讓咱們來仔細地看看ES6所帶來的更清晰的變量聲明與賦值語法。現今的變量聲明語法十分的直接:左邊是一個變量名,右邊能夠是一個數組:[]的表達式或一個對象:{}的表達式,等等。解構賦值容許咱們將右邊的表達式看起來也像變量聲明通常,而後在左邊將值一一提取。聽起來有點迷糊?讓咱們一塊兒看看下面的例子就好。javascript

數組的解構賦值

如今假設咱們有一個value變量,其值爲[1, 2, 3, 4, 5]。而後咱們想給數組的前三個元素分別聲明一個變量。傳統的作法是單獨聲明和賦值每個變量:java

jsvar value = [1, 2, 3, 4, 5];
var el1 = value[0];
var el2 = value[1];
var el3 = value[0];

有了這幾個新變量,咱們本來的value如今能夠被表示爲[el1, el2, el3, 4, 5],由於咱們如今並不關心後兩個元素,因此也能夠說被表示爲[el1, el2, el3]。那麼如今,ES6容許咱們在左邊使用這個表達式來達到和上一個代碼塊同樣的效果:es6

jsvar value = [1, 2, 3, 4, 5];
var [el1, el2, el3] = value;

右邊沒必要必定是變量名:正則表達式

jsvar [el1, el2, el3] = [1, 2, 3, 4, 5];

左邊也沒必要必定是聲明:數組

jsvar el1, el2, el3;
[el1, el2, el3] = [1, 2, 3, 4, 5];

這使咱們經過僅僅使用兩個變量名,就能夠交換兩個變量的值,這是從前的JavaScript不可能辦到的事情:函數

js[el1, el2] = [el2, el1];

解構賦值也是可嵌套的:oop

jsvar value = [1, 2, [3, 4, 5]];
var [el1, el2, [el3, el4]] = value;

ES6中,返回一個數組的函數更像一個頭等公民了:rest

jsfunction tuple() {
  return [1, 2];
}

var [first, second] = tuple();

一樣能夠經過簡單地在指定位置省略變量來忽略數組中的某個元素:code

jsvar value = [1, 2, 3, 4, 5];
var [el1, , el3, , el5] = value;

這使得從正則表達式裏取出匹配的分組的過程十分得簡潔:對象

jsvar [, firstName, lastName] = "John Doe".match(/^(w+) (w+)$/);

更進一步,默認值一樣也能夠被指定:

jsvar [firstName = "John", lastName = "Doe"] = [];

須要注意的是默認值只會在對undefined值起做用,下面的例子中firstNamelastName都將是null

jsvar [firstName = "John", lastName = "Doe"] = [null, null];

rest參數(...變量名)讓事情變得更有趣,它使你能夠獲得數組中「剩餘「的元素。下面這個例子中,tail變量將接收數組中」剩餘「的元素,爲[4, 5]:

jsvar value = [1, 2, 3, 4, 5];
var [el1, el2, el3, ...tail] = value;

不幸的是,ES6中rest參數的實現很是原始,rest參數以後不能再有其餘參數(即只能是最後一個參數)。因此下面例子中的這些很是有用模式,在ES6中是不可能的(會報錯):

jsvar value = [1, 2, 3, 4, 5];
var [...rest, lastElement] = value;
var [firstElement, ...rest, lastElement] = value;

對象的解構賦值

如今,你已經對數組的解構賦值有了清晰的認識,讓咱們來看看對象的解構賦值。它們幾乎以一樣的方式工做,僅僅是從數組變成了對象:

jsvar person = {firstName: "John", lastName: "Doe"};
var {firstName, lastName} = person;

ES6容許變量名與對應的屬性名不一致。下面的例子中,name變量將會被聲明爲person.firstName的值:

jsvar person = {firstName: "John", lastName: "Doe"};
var {firstName: name, lastName} = person;

深層嵌套的對象也不會有問題:

jsvar person = {name: {firstName: "John", lastName: "Doe"}};
var {name: {firstName, lastName}} = person;

你還能夠嵌套些數組在裏面:

jsvar person = {dateOfBirth: [1, 1, 1980]};
var {dateOfBirth: [day, month, year]} = person;

或者一些其餘的:

jsvar person = [{dateOfBirth: [1, 1, 1980]}];
var [{dateOfBirth}] = person;

和數組解構賦值同樣,對象解構賦值也可使用默認值:

jsvar {firstName = "John", lastName: userLastName = "Doe"} = {};

默認值一樣也只會在對undefined值起做用,下面的例子中firstNamelastName也都將是null

jsvar {firstName = "John", lastName = "Doe"} = {firstName: null, lastName: null};

函數參數的解構賦值

ES6中,函數的參數也支持解構賦值。這對於有複雜配置參數的函數十分有用。你能夠結合使用數組和對象的解構賦值。

jsfunction findUser(userId, options) {
  if (options.includeProfile) ...
  if (options.includeHistory) ...
}

經過ES6,這會看上去更清晰簡潔:

jsfunction findUser(userId, {includeProfile, includeHistory}) {
  if (includeProfile) ...
  if (includeHistory) ...
}

最後

ES6的解構賦值給JavaScript的語法帶來了更多的現代化。它在減小了代碼量的同時,增長了代碼的可讀性和表現力。

原文地址

https://strongloop.com/strongblog/getting-started-with-javascript-es6-...

相關文章
相關標籤/搜索