三個(gè)嘆為觀止的ES6 Array hack

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硬耍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子边酒,更是在濱河造成了極大的恐慌经柴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墩朦,死亡現(xiàn)場離奇詭異坯认,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)介杆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹃操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人春哨,你說我怎么就攤上這事《魉牛” “怎么了赴背?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晶渠。 經(jīng)常有香客問我凰荚,道長,這世上最難降的妖魔是什么褒脯? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任便瑟,我火速辦了婚禮,結(jié)果婚禮上番川,老公的妹妹穿的比我還像新娘到涂。我一直安慰自己脊框,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布践啄。 她就那樣靜靜地躺著浇雹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屿讽。 梳的紋絲不亂的頭發(fā)上昭灵,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死泼舱,一個(gè)胖子當(dāng)著我的面吹牛原环,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滩字,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柱徙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奇昙,失蹤者是張志新(化名)和其女友劉穎护侮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體储耐,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羊初,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了什湘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长赞。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闽撤,靈堂內(nèi)的尸體忽然破棺而出得哆,到底是詐尸還是另有隱情,我是刑警寧澤哟旗,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布贩据,位于F島的核電站,受9級特大地震影響闸餐,放射性物質(zhì)發(fā)生泄漏饱亮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一舍沙、第九天 我趴在偏房一處隱蔽的房頂上張望近上。 院中可真熱鬧,春花似錦拂铡、人聲如沸壹无。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽格遭。三九已至哈街,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒迅,已是汗流浹背骚秦。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璧微,地道東北人作箍。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像前硫,于是被迫代替她去往敵國和親胞得。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 三屹电,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn)阶剑,只要將碼點(diǎn)放入大括號,就能正確解讀該字符危号。有了這...
    eastbaby閱讀 1,536評論 0 8
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前牧愁,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法外莲。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,389評論 0 1
  • 臟兮兮的小臉猪半, 帶著淳樸與微笑, 清澈的眼神偷线, 遠(yuǎn)離凡間的吵鬧喧囂磨确, 想對遙遠(yuǎn)去呼喚, 喂声邦,外面的世界乏奥,你們好! ...
    秀秀王子閱讀 254評論 0 1
  • 總算是找到了一個(gè)能向自己傾訴的平臺(tái)翔忽。 以此開始英融,我想忘記你,即使不知要多久歇式。 今晚,你應(yīng)該不會(huì)找我說話了吧胡野。 生日...
    顫栗親親閱讀 201評論 0 0
  • 看完演唱會(huì)就想寫點(diǎn)什么的材失,沒錯(cuò),這是我第一次看五月天硫豆,即使以前信誓旦旦說過很多次說一定要看一次龙巨,這么看來笼呆,也...
    力口貝_閱讀 357評論 4 4