成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Javascript函數(shù)式編程小結(jié)

zengdongbao / 1529人閱讀

摘要:源起函數(shù)式編程近幾年非常流行經(jīng)常可以在網(wǎng)上看到別人討論相關(guān)話題我機(jī)緣巧合之下在上看到有人提到一個(gè)講函數(shù)式編程的視頻看過(guò)之后突然茅塞頓開(kāi)瞬間把之前零碎的關(guān)于函數(shù)式編程的知識(shí)一下子都聯(lián)系了起來(lái)于是自己希望趁有空把這些知識(shí)總結(jié)一下這樣既可以回顧下

源起

函數(shù)式編程近幾年非常流行,經(jīng)??梢栽诰W(wǎng)上看到別人討論相關(guān)話題. 我機(jī)緣巧合之下在github上看到有人提到一個(gè)講js函數(shù)式編程的視頻,看過(guò)之后突然茅塞頓開(kāi),瞬間把之前零碎的關(guān)于函數(shù)式編程的知識(shí)一下子都聯(lián)系了起來(lái), 于是自己希望趁有空把這些知識(shí)總結(jié)一下, 這樣既可以回顧下知識(shí)耶沒(méi)準(zhǔn)能幫到一些對(duì)函數(shù)式編程感興趣的朋友們.

為什么需要函數(shù)式編程

其實(shí)千萬(wàn)別被這看似高深的名字嚇怕了, 其實(shí)我們碼農(nóng)用這種編程思想無(wú)非是為了能更爽的寫(xiě)好代碼. 總結(jié)一下函數(shù)式編程的優(yōu)點(diǎn)有以下兩個(gè)優(yōu)點(diǎn):

Less bug: 可讀性高, 邏輯上更容易理解.

less Time: 更高的抽象層級(jí), 代碼高度可復(fù)用.

高階函數(shù)(Higher-order functions)

這里又一個(gè)炫酷屌的名字: "高階函數(shù)". 別怕, 本文并不涉及高等數(shù)學(xué)的知識(shí)就可以讓你了解高階函數(shù)的概念. 但是等等! 高階函數(shù)跟函數(shù)式編程又有毛關(guān)系? 其實(shí)簡(jiǎn)單的說(shuō)就是高階函數(shù)的特性讓我們可以實(shí)現(xiàn)函數(shù)式編程.
廢話不多說(shuō), 下面就簡(jiǎn)單說(shuō)下什么是高階函數(shù):

Functions that operate on other functions, either by taking them as arguments or by returning them, are called higher-order functions.

從定義可以知道高階函數(shù)就是可以把函數(shù)作為變量傳入別的函數(shù), 或者一個(gè)函數(shù)的返回值是一個(gè)函數(shù)的函數(shù). 如果上面的話把你繞暈了那么我來(lái)簡(jiǎn)單的概括下就是函數(shù)可以被當(dāng)作變量在程序中傳來(lái)傳去. 下面舉幾個(gè)例子:

//把函數(shù)當(dāng)成變量
var foo = (x) => console.log(x)
//把函數(shù)當(dāng)作參數(shù)傳入另一個(gè)函數(shù)
var bar = (y, fn) => fn(y)
foo("FP is good") // FP is good
bar("FP is great", foo) //FP is great

下面這個(gè)例子更能體現(xiàn)高階函數(shù)的便利性, 如果我們要遍歷數(shù)組并且打印數(shù)組元素的信息, 你會(huì)怎么做?

var arr = [1,1,2,3,5,8]
function traverseArray(arr) {
  for (let i = 0; i < arr.length; i++) {
    console.log(`index: ${i}, value: ${arr[i]}`)
  }
}
traverseArray(arr)

Easy enough! 如果用函數(shù)式編程的思維重寫(xiě)上面的代碼應(yīng)該是這個(gè)樣子的:

function forEach(arr, fn) {
  for (let i = 0; i < arr.length; i++) {
    fn(i, arr[i], arr)
  }
}

forEach(arr, (index, value) => console.log(`index: ${index}, value: ${value}`))

WTF!? 說(shuō)好的函數(shù)式編程更簡(jiǎn)潔代碼量更少呢! 明顯第二種寫(xiě)法寫(xiě)的代碼更多啊. 別急, 其實(shí)es5的時(shí)候JS已經(jīng)把一系列高階函數(shù)設(shè)置好了,比如forRach, map, reduce, filter, every.. 讓我們用js的array.forEach重寫(xiě)上面的代碼:

arr.forEach((v, k) => console.log(`index: ${k}, value: ${v}`))

怎么樣, 一樣代碼解決戰(zhàn)斗。 也許看到這里你還是覺(jué)得沒(méi)什么意思,畢竟雖然代碼量少了些,但也沒(méi)感覺(jué)有什么本質(zhì)性的變化. 下面我會(huì)舉幾個(gè)比較常見(jiàn)的例子,通過(guò)例子讓我們一起體會(huì)這種有趣的編程思想,也許看過(guò)之后你的想法會(huì)有所改變.

常用方法舉例

先介紹下幾個(gè)常用的函數(shù), filter, map, reduce:

var animals = [
  {name: "a" , species: "dog", weight: 11},
  {name: "b", species: "cat", weight: 10},
  {name: "c", species: "fish", weight: 1},
  {name: "d", species: "cat", weight: 8},
  {name: "e", species: "rabbit", weight: 3}
]
// 找到所有種類(lèi)為貓的動(dòng)物
animals.filter((animal) => animal.species === "cat")
// [ { name: "b", species: "cat" }, { name: "d", species: "cat" } ]

// 返回所有動(dòng)物的名字
animals.map((animal) => animal.name)
// [ "a", "b", "c", "d", "e" ]

// 動(dòng)物總重
animals.reduce((pre, animal) => pre + animal.weight, 0)
//33

怎么樣? 如果用循環(huán)來(lái)寫(xiě)肯定不可能一行代碼就搞定吧. 讓我們看一些更深入更有意思的例子吧.
比如這道比較經(jīng)典的算法題: 給定一個(gè)字符串"abcdaabc"統(tǒng)計(jì)每個(gè)字符的出現(xiàn)次數(shù).

// 一般做法是這樣的
var str="abcdaabc"
var count = {};
var i;

for(i=0;i (pre[cur]++ || (pre[cur] = 1), pre), {})

由上面的例子可見(jiàn), 高階函數(shù)的特性讓我們?cè)谔幚磉@類(lèi)問(wèn)題時(shí)比普通的方法要方便的多. 在更實(shí)際的應(yīng)用場(chǎng)景中函數(shù)式編程的便利性更能充分的體現(xiàn), 其中一個(gè)經(jīng)典的例子是統(tǒng)計(jì)文本中出現(xiàn)頻率最高的十個(gè)單詞:

var fs = require("fs");
var content = fs.readFileSync("words.txt").toString();
var words = content.split(/[s.,/:
]+/);
// 把單詞全部變?yōu)樾?xiě)并利用上一個(gè)例子的方法統(tǒng)計(jì)單詞出現(xiàn)的次數(shù)
var tally = words.map((word) => word.toLowerCase())
                 .reduce((pre, cur) => (pre[cur]++ || (pre[cur]=1), pre), {})
//把object的key變成數(shù)組并進(jìn)行排序
var top10 = Object.keys(tally)
                  .map((key) => {
                    return {word: key, count: tally[key]}
                  })
                  .sort((a, b) => b.count - a.count)
                  .slice(0, 10)
console.log(top10)

上面這個(gè)例子充分體現(xiàn)了函數(shù)式編程思想的魅力,代碼精簡(jiǎn)并且可讀性高! 想一想如果你要用循環(huán)來(lái)寫(xiě)有多多少行代碼!
好了, 總結(jié)完畢, 最后附上參考資料.

參考資料

Functional programming in JavaScript
Functional Programming By Example
Eloquent javascript - chapter6

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86389.html

相關(guān)文章

  • javascript函數(shù)編程入門(mén)小結(jié)

    摘要:前言最近花了不少時(shí)間接觸學(xué)習(xí)的函數(shù)式的編程方式,而后為了加深理解,又去折騰。不過(guò)幸運(yùn)的是,天生具備了函數(shù)式編程的基本元素,所以學(xué)習(xí)的起點(diǎn)不會(huì)太低。初接觸第一個(gè)實(shí)例,函數(shù)式編程是如何做一個(gè)番茄炒雞蛋的。 前言 最近花了不少時(shí)間接觸學(xué)習(xí)javascript的函數(shù)式的編程方式,而后為了加深理解,又去折騰haskell。 不同于人們比較熟悉的命令式編程,如面向?qū)ο缶幊蹋╫op),函數(shù)式編程(f...

    includecmath 評(píng)論0 收藏0
  • 編程模型(范小結(jié)

    摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語(yǔ)言基本都具有面向?qū)ο蟮乃枷?,比如等等,而面向?qū)ο蟮闹饕枷雽?duì)象,類(lèi),繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會(huì)常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語(yǔ)言是面向?qū)ο蟮牡鹊?,這個(gè)編程模型到處可見(jiàn),但是始終搞不清是什么?什么語(yǔ)言又是什么編程模型,當(dāng)你新接觸一門(mén)語(yǔ)言的時(shí)候,有些問(wèn)題是需...

    miya 評(píng)論0 收藏0
  • 函數(shù)編程之組合

    摘要:在函數(shù)式編程的組合中,我們是從右到左執(zhí)行的,上述的例子中我們借助函數(shù)實(shí)現(xiàn)組合,當(dāng)然,我們也可以用自己的方式實(shí)現(xiàn)。小結(jié)函數(shù)式編程隨著多核的發(fā)展,開(kāi)始再次出現(xiàn)在我們的視野中,有時(shí)候也會(huì)擔(dān)心過(guò)于吹捧函數(shù)式,反而落入俗套。 程序的本質(zhì)是什么?數(shù)據(jù)結(jié)構(gòu)+算法!?。∥蚁脒@也是很多程序員給出的答案,我自己也認(rèn)可這一觀點(diǎn),當(dāng)我們了解了某一門(mén)編程語(yǔ)之后,接下來(lái)我們面對(duì)的往往是數(shù)據(jù)結(jié)構(gòu)和算法的學(xué)習(xí)。而現(xiàn)在...

    Jinkey 評(píng)論0 收藏0
  • 前端_JavaScript

    摘要:為此決定自研一個(gè)富文本編輯器。例如當(dāng)要轉(zhuǎn)化的對(duì)象有環(huán)存在時(shí)子節(jié)點(diǎn)屬性賦值了父節(jié)點(diǎn)的引用,為了關(guān)于函數(shù)式編程的思考作者李英杰,美團(tuán)金融前端團(tuán)隊(duì)成員。只有正確使用作用域,才能使用優(yōu)秀的設(shè)計(jì)模式,幫助你規(guī)避副作用。 JavaScript 專(zhuān)題之惰性函數(shù) JavaScript 專(zhuān)題系列第十五篇,講解惰性函數(shù) 需求 我們現(xiàn)在需要寫(xiě)一個(gè) foo 函數(shù),這個(gè)函數(shù)返回首次調(diào)用時(shí)的 Date 對(duì)象,注意...

    Benedict Evans 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<