在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倉庫,歡迎通過程式碼各種形式交流。