在JavaScript中色鸳,數(shù)組隨處可見琉历。在最新版本的ECMAScript 6背景下坠七,借助新的展開符水醋、解構(gòu)等特性,我們可以對數(shù)組做很多“四兩撥千斤”的事情彪置。
這片文章我會(huì)分享幾個(gè)超級有用的hack技巧拄踪。
遍歷空數(shù)組
JavaScript數(shù)組其實(shí)是天生“稀疏”的。稀疏數(shù)組其實(shí)是一個(gè)很重要的概念:
A sparse array is one in which the elements do not have contiguous indexes starting at 0.
從定義來看拳魁,稀疏數(shù)組就是沒有從0開始的連續(xù)的index宫蛆。
那么什么樣會(huì)有稀疏數(shù)組?原因無外乎:
- 有沒有被賦值的項(xiàng)的猛;
- 有被刪除(delete)的項(xiàng)
我們從下面這個(gè)例子來看:
const arr = new Array(4);
新建了一個(gè)長度為4的數(shù)組耀盗。你會(huì)發(fā)現(xiàn),遍歷這個(gè)數(shù)組我們只會(huì)得到:
arr.map((elem, index) => index);
// [undefined, undefined, undefined, undefined]
為了解決這個(gè)問題卦尊,比如叛拷,我想得到一個(gè)每一項(xiàng)值為其index的數(shù)組,長度為4岂却,可以這樣做:
const arr = Array.apply(null, new Array(4));
arr.map((elem, index) => index);
// [0, 1, 2, 3]
當(dāng)然忿薇,我們有一個(gè)更好的方法,就是使用ES6的展開符特性:
const arr = [...new Array(4)];
arr.map((elem, index) => index);
// [0, 1, 2, 3]
給方法傳遞一個(gè)空參數(shù)
如果你想調(diào)用某個(gè)方法躏哩,但是忽略這個(gè)方法的某個(gè)參數(shù)署浩,那么正常情況下,這樣做是會(huì)報(bào)錯(cuò)的:
function method (a1, a2, a3) { console.log('ok'); }
method('parameter1', , 'parameter3');
// Uncaught SyntaxError: Unexpected token ,
在實(shí)際開發(fā)中扫尺,這樣的場景其實(shí)屢見不鮮筋栋。通常的做法是,將這個(gè)函數(shù)參數(shù)傳遞為null或者undefined:
method('parameter1', null, 'parameter3')
// or
method('parameter1', undefined, 'parameter3');
我個(gè)人其實(shí)并不喜歡用null來代替正驻,因?yàn)樵贘avaScript中弊攘,null會(huì)被當(dāng)作一個(gè)object來處理,這其實(shí)是很奇怪的姑曙。但是在ES6中襟交,借助展開符和數(shù)組特性,我們能更好地實(shí)現(xiàn)上述做法伤靠。
上文提到JavaScript中數(shù)組其實(shí)是天生稀疏的捣域,所以,給一個(gè)數(shù)組傳遞一個(gè)空值是沒有問題的宴合。因此焕梅,我們這樣做:
method(...['parameter1', , 'parameter3']);
// ok
數(shù)組去重
數(shù)組去重,是一個(gè)老生常談的話題形纺。實(shí)現(xiàn)方式真的已經(jīng)很多了丘侠。但是我其實(shí)一直以來不明白Array構(gòu)造函數(shù)的原型上,為什么沒有一個(gè)“官方”的方法逐样,來產(chǎn)生一個(gè)不重復(fù)的數(shù)組或者完成數(shù)組去重的功能蜗字。ES6展開符的出現(xiàn)打肝,成為了一種“官方”解決方案。
我們使用展開符挪捕,結(jié)合Set構(gòu)造函數(shù)粗梭,便可以產(chǎn)生一個(gè)不含重復(fù)項(xiàng)的數(shù)組:
const arr = [...new Set([1, 2, 3, 3])]
// [1, 2, 3]
其實(shí), NaN != NaN 對數(shù)組去重的不同方法會(huì)產(chǎn)生不同影響级零。
在上述方法當(dāng)中断医,我們會(huì)得到:
const arr = [...new Set([1, 2, 3, 3, NaN, NaN])]
// [1, 2, 3, NaN]
總結(jié)
今天介紹了幾個(gè)利用ES6新特性對數(shù)組實(shí)現(xiàn)的一些hack方法,簡單有效且優(yōu)雅得體奏纪。在ES6引領(lǐng)前端開發(fā)的今天鉴嗤,希望對大家能有所啟發(fā)。也歡迎留言序调,與我討論醉锅。
Happy Coding!
PS: 作者Github倉庫,歡迎通過代碼各種形式交流发绢。