JavaScript 高階函數(shù)淺析

高階函數(shù)

在 JavaScript 中辟宗,函數(shù)是一種特殊類型的對(duì)象僵朗,它們是 Function objects。高階函數(shù)英文叫 Higher-order function即寡,它的定義很簡(jiǎn)單修然,就是至少滿足下列一個(gè)條件的函數(shù):

  • 接受一個(gè)或多個(gè)函數(shù)作為輸入

  • 輸出一個(gè)函數(shù)

也就是說高階函數(shù)是對(duì)其他函數(shù)進(jìn)行操作的函數(shù)笛钝,可以將它們作為參數(shù)傳遞,或者是返回它們愕宋。 簡(jiǎn)單來說玻靡,高階函數(shù)是一個(gè)接收函數(shù)作為參數(shù)傳遞或者將函數(shù)作為返回值輸出的函數(shù)。

函數(shù)作為參數(shù)傳遞

JavaScript 語言中內(nèi)置了一些高階函數(shù)中贝,比如 Array.prototype.map囤捻,Array.prototype.filter 和 Array.prototype.reduce,它們接受一個(gè)函數(shù)作為參數(shù)邻寿,并應(yīng)用這個(gè)函數(shù)到列表的每一個(gè)元素蝎土。我們來看看使用它們與不使用高階函數(shù)的方案對(duì)比视哑。

Array.prototype.map

map() 方法創(chuàng)建一個(gè)新數(shù)組,其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果誊涯,原始數(shù)組不會(huì)改變黎炉。傳遞給 map 的回調(diào)函數(shù)(callback)接受三個(gè)參數(shù),分別是 currentValue醋拧、index(可選)、array(可選)淀弹,除了 callback 之外還可以接受 this 值(可選)丹壕,用于執(zhí)行 callback 函數(shù)時(shí)使用的this 值。

來個(gè)簡(jiǎn)單的例子方便理解薇溃,現(xiàn)在有一個(gè)數(shù)組 [1, 2, 3, 4]菌赖,我們想要生成一個(gè)新數(shù)組,其每個(gè)元素皆是之前數(shù)組的兩倍沐序,那么我們有下面兩種使用高階和不使用高階函數(shù)的方式來實(shí)現(xiàn)琉用。

不使用高階函數(shù)

const arr1 = [1, 2, 3, 4];
const arr2 = [];
for (let i = 0; i < arr1.length; i++) {
  arr2.push( arr1[i] * 2);
}

console.log( arr2 );
// [2, 4, 6, 8]
console.log( arr1 );
// [1, 2, 3, 4]

使用高階函數(shù)

const arr1 = [1, 2, 3, 4];
const arr2 = arr1.map(item => item * 2);

console.log( arr2 );
// [2, 4, 6, 8]
console.log( arr1 );
// [1, 2, 3, 4]

Array.prototype.filter

filter() 方法創(chuàng)建一個(gè)新數(shù)組, 其包含通過提供函數(shù)實(shí)現(xiàn)的測(cè)試的所有元素,原始數(shù)組不會(huì)改變策幼。接收的參數(shù)和 map 是一樣的邑时,其返回值是一個(gè)新數(shù)組、由通過測(cè)試的所有元素組成特姐,如果沒有任何數(shù)組元素通過測(cè)試晶丘,則返回空數(shù)組。

來個(gè)例子介紹下唐含,現(xiàn)在有一個(gè)數(shù)組 [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4]浅浮,我們想要生成一個(gè)新數(shù)組,這個(gè)數(shù)組要求沒有重復(fù)的內(nèi)容捷枯,即為去重滚秩。

不使用高階函數(shù)

const arr1 = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
const arr2 = [];
for (let i = 0; i < arr1.length; i++) {
  if (arr1.indexOf( arr1[i] ) === i) {
    arr2.push( arr1[i] );
  }
}

console.log( arr2 );
// [1, 2, 3, 5, 4]
console.log( arr1 );
// [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4]

使用高階函數(shù)

const arr1 = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
const arr2 = arr1.filter( (element, index, self) => {
    return self.indexOf( element ) === index;
});

console.log( arr2 );
// [1, 2, 3, 5, 4]
console.log( arr1 );
// [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4]

Array.prototype.reduce

reduce() 方法對(duì)數(shù)組中的每個(gè)元素執(zhí)行一個(gè)提供的 reducer 函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個(gè)返回值淮捆。傳遞給 reduce 的回調(diào)函數(shù)(callback)接受四個(gè)參數(shù)郁油,分別是累加器 accumulator、currentValue争剿、currentIndex(可選)已艰、array(可選),除了 callback 之外還可以接受初始值 initialValue 值(可選)蚕苇。

如果沒有提供 initialValue哩掺,那么第一次調(diào)用 callback 函數(shù)時(shí),accumulator 使用原數(shù)組中的第一個(gè)元素涩笤,currentValue 即是數(shù)組中的第二個(gè)元素嚼吞。 在沒有初始值的空數(shù)組上調(diào)用 reduce 將報(bào)錯(cuò)盒件。

如果提供了 initialValue,那么將作為第一次調(diào)用 callback 函數(shù)時(shí)的第一個(gè)參數(shù)的值舱禽,即 accumulator炒刁,currentValue 使用原數(shù)組中的第一個(gè)元素。

來個(gè)簡(jiǎn)單的例子介紹下誊稚,現(xiàn)在有一個(gè)數(shù)組 [0, 1, 2, 3, 4]翔始,需要計(jì)算數(shù)組元素的和,需求比較簡(jiǎn)單里伯,來看下代碼實(shí)現(xiàn)城瞎。

不使用高階函數(shù)

const arr = [0, 1, 2, 3, 4];
let sum = 0;
for (let i = 0; i < arr.length; i++) {
  sum += arr[i];
}

console.log( sum );
// 10
console.log( arr );
// [0, 1, 2, 3, 4]

使用高階函數(shù)

//無 initialValue 值
const arr = [0, 1, 2, 3, 4];
let sum = arr.reduce((accumulator, currentValue, currentIndex, array) => {
  return accumulator + currentValue;
});

console.log( sum );
// 10
console.log( arr );
// [0, 1, 2, 3, 4]

//有 initialValue 值10
const arr = [0, 1, 2, 3, 4];
let sum = arr.reduce((accumulator, currentValue, currentIndex, array) => {
  return accumulator + currentValue;
}, 10);

console.log( sum );
// 20
console.log( arr );
// [0, 1, 2, 3, 4]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疾瓮,隨后出現(xiàn)的幾起案子脖镀,更是在濱河造成了極大的恐慌,老刑警劉巖狼电,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜒灰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肩碟,警方通過查閱死者的電腦和手機(jī)强窖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削祈,“玉大人毕骡,你說我怎么就攤上這事⊙沂荩” “怎么了未巫?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)启昧。 經(jīng)常有香客問我叙凡,道長(zhǎng),這世上最難降的妖魔是什么密末? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任握爷,我火速辦了婚禮,結(jié)果婚禮上严里,老公的妹妹穿的比我還像新娘新啼。我一直安慰自己,他們只是感情好刹碾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布燥撞。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪物舒。 梳的紋絲不亂的頭發(fā)上色洞,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音冠胯,去河邊找鬼火诸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荠察,可吹牛的內(nèi)容都是我干的置蜀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悉盆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盾碗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舀瓢,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耗美,沒想到半個(gè)月后京髓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡商架,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年堰怨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇摸。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡备图,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赶袄,到底是詐尸還是另有隱情揽涮,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布饿肺,位于F島的核電站蒋困,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敬辣。R本人自食惡果不足惜雪标,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溉跃。 院中可真熱鬧村刨,春花似錦、人聲如沸撰茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至髓梅,卻和暖如春拟蜻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枯饿。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工酝锅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奢方。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓搔扁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親蟋字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稿蹲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 本期開始介紹 JavaScript 中的高階函數(shù),在 JavaScript 中鹊奖,函數(shù)是一種特殊類型的對(duì)象苛聘,它們是 ...
    編程小世界閱讀 485評(píng)論 0 0
  • The JavaScriptArrayobject is a global object thatis used ...
    skycolor閱讀 568評(píng)論 0 0
  • JavaScript的相關(guān)語法知識(shí):1、函數(shù)(important)基本上所有的高級(jí)語言(C忠聚、OC设哗、JavaScri...
    天山雪蓮_38324閱讀 630評(píng)論 0 2
  • 1. 那你忙吧,我不打擾你了两蟀,我敢打賭网梢,這句話你們都應(yīng)該說過或被別人說過吧,反正我真的很討厭這句話赂毯。 前幾天战虏,跟一...
    文長(zhǎng)長(zhǎng)閱讀 7,927評(píng)論 27 107
  • 我認(rèn)為:消除苦難烦感、創(chuàng)造幸福是人類的天職! 每當(dāng)我看到或聽到哪個(gè)地方又地震了膛堤,傷亡多少人啸盏,毀壞多少房屋,造成多大損失...
    久龍_da61閱讀 266評(píng)論 0 1