不得不知的ES6小技巧

2021-08-18 13:43:42 字數 3741 閱讀 7225

es6出來已經有好幾年了,同時很多新特性可以被巧妙地運用在專案中。

我想要列下其中一些,希望它們對你有用。

1. 強制要求引數

es6提供了預設引數值機制,允許你為引數設定預設值,防止在函式被呼叫時沒有傳入這些引數。

在下面的例子中,我們寫了乙個required()函式作為引數a和b的預設值。這意味著如果a或b其中有乙個引數沒有在呼叫時傳值,會預設required()函式,然後丟擲錯誤。

const required = () => ;

const add = (a = required(), b = required()) => a + b; add(1, 2) //3

add(1) // error: missing parameter.

2. 強大的reduce

陣列的reduce方法用途很廣。它一般被用來把陣列中每一項規約到單個值。但是你可以利用它做更多的事。

假設現在有乙個數列,你希望更新它的每一項(map的功能)然後篩選出一部分(filter的功能)。如果是先使用map然後filter的話,你需要遍歷這個陣列兩次。

在下面的**中,我們將數列中的值翻倍,然後挑選出那些大於50的數。有注意到我們是如何非常高效地使用reduce來同時完成map和filter方法的嗎?

const numbers = [10, 20, 30, 40];

const doubledover50 = numbers.reduce((finallist, num) =>  

return finallist; }, ); doubledover50; // [60, 80]

如果你認真閱讀了上面的**,你應該能理解reduce是可以取代map和filter的。

reduce的另外乙個用途是能夠匹配給定字串中的圓括號。對於乙個含有圓括號的字串,我們需要知道()的數量是否一致,並且(是否出現在)之前。

下面的**中我們使用reduce可以輕鬆地解決這個問題。我們只需要先宣告乙個counter變數,初值為0。在遇到(時counter加一,遇到)時counter減一。如果左右括號數目匹配,那最終結果為0。

//returns 0 if balanced.

const isparensbalanced = (str) =>  else if(char === '(')  else if(char === ')')  else       }, 0); //<-- starting value of the counter} isparensbalanced('(())') // 0 <-- balanced

isparensbalanced('(asdfds)') //0 <-- balanced

isparensbalanced('(()') // 1 <-- not balanced

isparensbalanced(')(') // -1 <-- not balanced

很多時候,你希望統計陣列中重複出現項的個數然後用乙個物件表示。那麼你可以使用reduce方法處理這個陣列。

下面的**將統計每一種車的數目然後把總數用乙個物件表示。

var cars = ['bmw','benz', 'benz', 'tesla', 'bmw', 'toyota'];

var carsobj = cars.reduce(function (obj, name) , {}); carsobj; // =>

reduce的其他用處實在是太多了,建議閱讀mdn的相關**示例。

3. 物件解構
有時候你不希望保留某些物件屬性,也許是因為它們包含敏感資訊或僅僅是太大了(just too big)。你可能會列舉整個物件然後刪除它們,但實際上只需要簡單的將這些無用屬性賦值給變數,然後把想要保留的有用部分作為剩餘引數就可以了。

下面的**裡,我們希望刪除_internaltoobig引數。我們可以把它們賦值給internaltoobig變數,然後在cleanobject中儲存剩下的屬性以備後用。

let  = , el2: '2', el3: '3'};

console.log(cleanobject); //

在下面的**中,engine是物件car中巢狀的乙個物件。如果我們對enginevin屬**興趣,使用解構賦值可以很輕鬆地得到它。

var car =  }

const modelandvin = (}) =>  vin: $`); } modelandvin(car); // => model: bmw 2018  vin: 12345

es6帶來了擴充套件運算子(...)。它一般被用來解構陣列,但你也可以用它處理物件。

接下來,我們使用擴充套件運算子來展開乙個新的物件,第二個物件中的屬性值會改寫第乙個物件的屬性值。比如object2bc就會改寫object1的同名屬性。

let object1 = 

let object2 =

let merged =  //spread and re-add into merged

console.log(merged) //

4. sets
在es6中,因為set只儲存唯一值,所以你可以使用set刪除重複項。

let arr = [1, 1, 2, 2, 3, 3];

let deduped = [...new set(arr)] // [1, 2, 3]

使用擴充套件運算子就可以簡單的將set轉換為陣列。所以你可以對set使用array的所有原生方法。

比如我們想要對下面的set進行filter操作,獲取大於3的項。

let myset = new set([1,2, 3, 4, 5]);

var filtered = [...myset].filter((x) => x > 3) // [4, 5]

5. 陣列解構
有時候你會將函式返回的多個值放在乙個陣列裡。我們可以使用陣列解構來獲取其中每乙個值。

let param1 = 1;

let param2 = 2;

//swap and assign param1 & param2 each others values

[param1, param2] = [param2, param1];

console.log(param1) // 2

console.log(param2) // 1

async function getfullpost()

const [post, comments] = getfullpost();

你不得不知的這些海報設計小技巧

1 了解海報 海報又稱招貼畫,是一種傳播資訊的媒介,具有悠久的歷史,由手繪到印刷,它隨著社會的 發展,是藝術設計領域最直觀的,最能張揚個性並且真實記錄時代變遷的一種 大眾化的藝術形式,是我們可以在其中表達乙個國家的精神,乙個民族的精神,乙個時代的精神或是文化精神的無聲宣傳者。在豐富的視覺語言,獨特的...

前端工程師不得不知道的ES6新特性(三)

三 map map是 es6 新增的有序鍵值對集合。鍵值對的 key 和 value 都可以是任何型別的元素。通過 set key,value 方法為 map 設定新的鍵值對,如果設定的 key 已經存在則用新的 value 覆蓋,map 在比較 key 時也不做型別轉換,這一點和 set 類似。m...

HTTP協議不得不知的基礎

http超文字傳輸協議,是乙個引用層協議,基於 請求與響應 模式,以url作為網路資源的定位。url的格式 http host port path 其中,host 為合法的internet主機網域名稱或者ip位址,port是埠值,預設埠為80,path為請求資源的路徑 資源定位 url 資源管理 六...