[譯] 三個歎為觀止的ES6 Array hack

LucasHC發表於2017-04-12

在JavaScript中,陣列隨處可見。在最新版本的ECMAScript 6背景下,藉助新的展開符、解構等特性,我們可以對陣列做很多“四兩撥千斤”的事情。

這片文章我會分享幾個超級有用的hack技巧。

遍歷空陣列

JavaScript陣列其實是天生“稀疏”的。稀疏陣列其實是一個很重要的概念:

A sparse array is one in which the elements do not have contiguous indexes starting at 0.

從定義來看,稀疏陣列就是沒有從0開始的連續的index。

那麼什麼樣會有稀疏陣列?原因無外乎:

  • 有沒有被賦值的項;
  • 有被刪除(delete)的項

我們從下面這個例子來看:

const arr = new Array(4);複製程式碼

新建了一個長度為4的陣列。你會發現,遍歷這個陣列我們只會得到:

arr.map((elem, index) => index);
// [undefined, undefined, undefined, undefined]複製程式碼

為了解決這個問題,比如,我想得到一個每一項值為其index的陣列,長度為4,可以這樣做:

const arr = Array.apply(null, new Array(4));
arr.map((elem, index) => index);
// [0, 1, 2, 3]複製程式碼

當然,我們有一個更好的方法,就是使用ES6的展開符特性:

const arr = [...new Array(4)];
arr.map((elem, index) => index);
// [0, 1, 2, 3]複製程式碼

給方法傳遞一個空引數

如果你想呼叫某個方法,但是忽略這個方法的某個引數,那麼正常情況下,這樣做是會報錯的:

function method (a1, a2, a3) { console.log('ok'); }
method('parameter1', , 'parameter3');
// Uncaught SyntaxError: Unexpected token ,複製程式碼

在實際開發中,這樣的場景其實屢見不鮮。通常的做法是,將這個函式引數傳遞為null或者undefined:

method('parameter1', null, 'parameter3') 
// or
method('parameter1', undefined, 'parameter3');複製程式碼

我個人其實並不喜歡用null來代替,因為在JavaScript中,null會被當作一個object來處理,這其實是很奇怪的。但是在ES6中,藉助展開符和陣列特性,我們能更好地實現上述做法。

上文提到JavaScript中陣列其實是天生稀疏的,所以,給一個陣列傳遞一個空值是沒有問題的。因此,我們這樣做:

method(...['parameter1', , 'parameter3']);
// ok複製程式碼

陣列去重

陣列去重,是一個老生常談的話題。實現方式真的已經很多了。但是我其實一直以來不明白Array建構函式的原型上,為什麼沒有一個“官方”的方法,來產生一個不重複的陣列或者完成陣列去重的功能。ES6展開符的出現,成為了一種“官方”解決方案。

我們使用展開符,結合Set建構函式,便可以產生一個不含重複項的陣列:

const arr = [...new Set([1, 2, 3, 3])]
// [1, 2, 3]複製程式碼

其實, NaN != NaN 對陣列去重的不同方法會產生不同影響。
在上述方法當中,我們會得到:

const arr = [...new Set([1, 2, 3, 3, NaN, NaN])]
// [1, 2, 3, NaN]   複製程式碼

總結

今天介紹了幾個利用ES6新特性對陣列實現的一些hack方法,簡單有效且優雅得體。在ES6引領前端開發的今天,希望對大家能有所啟發。也歡迎留言,與我討論。

Happy Coding!

PS: 作者Github倉庫,歡迎通過程式碼各種形式交流。

相關文章