三個嘆為觀止的ES6 Array hack

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

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

遍歷空數(shù)組

JavaScript數(shù)組其實是天生“稀疏”的。稀疏數(shù)組其實是一個很重要的概念:

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

從定義來看,稀疏數(shù)組就是沒有從0開始的連續(xù)的index。

那么什么樣會有稀疏數(shù)組?原因無外乎:

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

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

const arr = new Array(4);

新建了一個長度為4的數(shù)組。你會發(fā)現(xiàn),遍歷這個數(shù)組我們只會得到:

arr.map((elem, index) => index);
// [undefined, undefined, undefined, undefined]

為了解決這個問題,比如,我想得到一個每一項值為其index的數(shù)組,長度為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]

給方法傳遞一個空參數(shù)

如果你想調用某個方法,但是忽略這個方法的某個參數(shù),那么正常情況下,這樣做是會報錯的:

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

在實際開發(fā)中,這樣的場景其實屢見不鮮。通常的做法是,將這個函數(shù)參數(shù)傳遞為null或者undefined:

method('parameter1', null, 'parameter3') 
// or
method('parameter1', undefined, 'parameter3');

我個人其實并不喜歡用null來代替,因為在JavaScript中,null會被當作一個object來處理,這其實是很奇怪的。但是在ES6中,借助展開符和數(shù)組特性,我們能更好地實現(xiàn)上述做法。

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

method(...['parameter1', , 'parameter3']);
// ok

數(shù)組去重

數(shù)組去重,是一個老生常談的話題。實現(xiàn)方式真的已經很多了。但是我其實一直以來不明白Array構造函數(shù)的原型上,為什么沒有一個“官方”的方法,來產生一個不重復的數(shù)組或者完成數(shù)組去重的功能。ES6展開符的出現(xiàn),成為了一種“官方”解決方案。

我們使用展開符,結合Set構造函數(shù),便可以產生一個不含重復項的數(shù)組:

const arr = [...new Set([1, 2, 3, 3])]
// [1, 2, 3]

其實, NaN != NaN 對數(shù)組去重的不同方法會產生不同影響。
在上述方法當中,我們會得到:

const arr = [...new Set([1, 2, 3, 3, NaN, NaN])]
// [1, 2, 3, NaN]   

總結

今天介紹了幾個利用ES6新特性對數(shù)組實現(xiàn)的一些hack方法,簡單有效且優(yōu)雅得體。在ES6引領前端開發(fā)的今天,希望對大家能有所啟發(fā)。也歡迎留言,與我討論。

Happy Coding!

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 三,字符串擴展 3.1 Unicode表示法 ES6 做出了改進,只要將碼點放入大括號,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,667評論 0 8
  • 函數(shù)參數(shù)的默認值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認值,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,703評論 0 1
  • 臟兮兮的小臉, 帶著淳樸與微笑, 清澈的眼神, 遠離凡間的吵鬧喧囂, 想對遙遠去呼喚, 喂,外面的世界,你們好! ...
    秀秀王子閱讀 294評論 0 1
  • 總算是找到了一個能向自己傾訴的平臺。 以此開始,我想忘記你,即使不知要多久。 今晚,你應該不會找我說話了吧。 生日...
    顫栗親親閱讀 246評論 0 0
  • 看完演唱會就想寫點什么的,沒錯,這是我第一次看五月天,即使以前信誓旦旦說過很多次說一定要看一次,這么看來,也...
    力口貝_閱讀 375評論 4 4

友情鏈接更多精彩內容