亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

《JavaScript函數式編程》讀后感

2019-11-20 11:53:36
字體:
來源:轉載
供稿:網友

本文章記錄本人在學習 函數式 中理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復習。

在近期看到了《JavaScript函數式編程》這本書預售的時候就定了下來。主要目的是個人目前還是不理解什么是函數式編程。在自己學習的過程中一直聽到身邊的人說面向過程編程和面向對象編程,而函數式就非常少。為了自己不要落后于其他同學的腳步,故想以寫筆記的方式去分享和記錄自己閱讀中所汲取的知識。

js 和函數式編程

書中用了一句簡單的話來回答了什么是函數式編程:

函數式編程通過使用函數來將值轉換為抽象單元,接著用于構建軟件系統。
我覺得一定有同學看了這一句還是不怎么動什么是函數式編程,且為什么要使用函數式編程。后面的很多例子都使用到了Underscore。

以函數為抽象單元

抽象方法是指隱藏了細節的函數。舉一個書中的例子,一個檢測輸出年齡值的函數(主要是關于錯誤和警告的報告):

function parseAge(age) {  if (!_.isString(age))    throw new Error("Expecting a string");  var a;  console.log("Attempting to parse an age");  a = parseInt(age, 10);  if (_.isNaN(a)) {    console.log(["Could not parse age: "].join());    a = 0;  }  return a;}

上面的函數判斷我們是不是輸入一個年齡,且必須是字符串形式。接著就是來運行這個函數:

parseAge("42"); //=> 42parseAge(42); //=> Error:Expecting a stringparseAge("hhhh"); //=> 0

上面的parseAge函數工作正常沒有什么問題。如果我們要修改輸出錯誤=信息和警告的呈現方式、那么就需要修改相應的代碼行,以及其他地方的輸出模式。書中給的方法是通過將它們抽象成不同的函數來實現:

function fail(thing) {  throw new Error(thing);}function warn(thing) {  console.log(["WARNING:", thing].join(''));}function note(thing) {  console.log(["NOTE:", thing].join(''));}

接著就是使用上面的函數,去重構parseAge這個函數。

funciton parseAge(age) {  if (!_.isString(age))    fail("Expecting a string");  var a;  note("Attempting to parse an age");  a = parseInt(age, 10);  if (_.isNaN(a)) {    warn(["Could not parse age:", age].join(""));    a = 0;  }  return a;}

把報告錯誤的代碼都放到不同的函數里去,且重構后的parseAge和之前的也沒有多大的變化。但是不同的就是現在報告錯誤、信息和警告的想法已經被抽象化。錯誤、信息和警告的報告結果也是完全被修改了。

這么做是,由于行為包含在單一的函數中,所以函數可以被能夠提供類似行為的新函數取代,或直接被完全不同的行為取代。

封裝和隱蔽

這個標題很容易理解,舉個例子。像我們經常使用iife來避免全局的污染,這就是一個封裝和隱蔽的很好例子。通過使用iife來隱蔽自己的寫的一些變量和方法,目的就是不去污染全局的環境。這也是使用閉包的方式來隱蔽數據。

因為閉包也是一種函數。且和現在在學習函數式編程有莫大的關系。但是也不要忘記了之前學習的面向對象式封裝,畢竟這兩者不能說誰更加的好。但是都掌握了也不是一件什么壞事。一句老話:看需求。

以函數為行為單位

隱藏數據和行為(通常不方便于快速修改)只是一種講函數作為抽象單元的方式。另一種方式就是提供一種簡單地存儲方式和傳遞基本行為的離線散單元。

書中一個小栗子,通過使用js語法來索引數組中的一個值:

var arr = ['a', 'b', 'c'];arr[1] //=> b

雖然上面索引數組中的中的一個值很簡單,但并沒有辦法可以在不把它放到函數里的前提下,獲取這個行為并根據需要來使用他/她。寫一個簡單函數nth,用來索引數組中的一個值:

function nth(a, index) {  return a[index];}

接著運行:

nth(arr, 1); //=> b
運行成功,但是如果傳入一個空對象時,就會報錯了。因此,如果想圍繞nth來實現函數抽象,我們或許會設計下面的聲明:nth返回一個存儲在允許索引訪問的數據類型中的有效袁術。這段聲明的關鍵在于索引數據的類型的概念?;蛟S需要一個函數來判斷類型:

function isIndexed(data) {  return _.isArray(data) || _.isString(data);}

接著繼續完善nth函數。isIndexed函數是一個提供了判斷某個數據是否為字符串或者數組的抽象。

function nth(a, index) {  if (!_.isNumber(index))     fail("Expected a number as the index");  if (!isIndexed(a))    fail("Not supported on non-indexed type");  if ((index < 0) || (index > a.length - 1))    fail("Index value is out of bounds");  return a[index];}

從index抽對象構建nth函數抽象的方式一樣,也可以以同樣的方式來構建一個second抽象:

function second(a) {  return nth(a, 1);}

函數second允許在一個不同但相關的情況下,正確的使用nth函數:

second(arr); //=> b
通過上面的栗子,就知道。我們可以把每一步都抽象成一個函數,把每一個參數都抽象出來。雖然這樣寫感覺定義了許多函數。不過這樣更加容易理解每一項的功能和流程。

數據抽象

JavaScript 的對象原型模型是一個豐富且基礎的數據方案。
因為js沒有類的原因,就有了許多模擬類的方法,且在ES6上也出現了class關鍵字。盡管類有許多長處,但很多的時候js應用程序的數據需求幣類中的簡單的要多。

基于類的對象系統的一個有理的論據是實現用戶界面的歷史使用。
js中的對象和數組已經能夠滿足我們對數據的操作了,且Underscore也是重點也是如何處理數組和對象。

實施和使用的簡易性是使用js的核心數據結構進行數據建模的目的。這并不是說面向對象或者基于類的方法就完全沒有用。處理集合為中心的函數式方式更加適合處理與人有關的數據,而面向對象的方法最適合模擬人。

js函數式初試

在開始函數式編程前,需要先定義兩個常用且有用的函數:

function existy(x) {  return x != null}function truthy(x) {  return (x !== false) && existy(x);}

existy函數旨在定義事物之前的存在。js中就有兩個值可以表示不存在:null和undefined。
truthy函數用來判斷一個對象是否應該認為是true的同義詞。

我們可以在很多地方使用到這兩個函數,其實函數式理念來自于它們的使用。有些同學可能已經熟悉了許多js實現中的map forEach等方法。且Underscroe也提供了許多類似的方法,這也許就是選擇Underscroe來輔助學習函數式編程的原因。

簡單說下就是:

一個對”存在“的抽象函數的定義。
一個建立在存在函數之上的,對”真“的抽象函數定義。
通過其他函數來使用上面的兩個函數,以實現更多的行為。

加速

大概了解了函數式編程之后。你可能會想這函數式編程不是很慢嗎?比如前面獲取數組索引,有必要定義一個函數來專門獲取嗎?直接用arr[index]絕對比那些函數來的快。

var arr = [1, 2, 3, 4, 5];// 最快for (var i = 0; i < arr.length; i++) {  console.log(arr[i]);}// 較慢_.each(arr, function (val, index) {  console.log(index);});

但是我們在寫代碼的時候可能不會考慮的那么深,也許使用函數的確比原生要慢一些。但是大多數情況下也不會去在乎那么點時間,且現在有強大的v8引擎,大部分情況下的他都能很高效的編譯和執行我們的js代碼。所以我們沒有必要在還沒有寫出正確的代碼前考慮運算速度。

如果是我來選擇的話,可能會更加關注與代碼的風格。那種寫法寫的舒服看的舒服就使用哪一種,當然也是要保證基本的運算速度下,以不至于慢的離譜。看的舒服的代碼比跑的快的代碼可能更加有成就感。

總結

看完了第一章也是可以小結一下js的函數式編程。下面引用書上的總結:

確定抽象,并為其構建函數。
利用已有的函數來構建更加復雜的抽象。
通過將現有的函數傳給其他的函數來構建更加復雜的抽象。
單是構建抽象還是不夠的,如果能夠把強大的數據抽象結合來實現函數式編程效果會更加好。

后面的章節讀后感會慢慢的分享給大家,敬請關注。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲在线免费视频| 日韩中文av在线| 久热精品视频在线免费观看| 亚洲欧洲日产国码av系列天堂| 亚洲在线观看视频网站| 国产精品久久久久av| 国产91网红主播在线观看| 欧美色视频日本高清在线观看| 68精品国产免费久久久久久婷婷| 亚洲精品www久久久久久广东| 欧美日韩精品在线播放| 欧美性jizz18性欧美| 日韩欧美国产一区二区| 亚洲国产精品国自产拍av秋霞| 亚洲国产日韩欧美在线99| 久久综合久久八八| 国产精品美腿一区在线看| 亚洲春色另类小说| 成人在线视频网| 日本sm极度另类视频| 久久精品国产一区二区电影| 国产日韩一区在线| 国产一区二区三区四区福利| 久久国产精品亚洲| 亚洲精品国产精品国自产观看浪潮| 亚洲欧洲黄色网| 欧美日韩在线免费观看| 欧美日韩国产在线| 亚洲成年网站在线观看| 国产精品美女www| 色婷婷成人综合| 亚洲天天在线日亚洲洲精| 亚洲人成网站999久久久综合| 亚洲精品久久久久久久久| 国产精品露脸自拍| 日韩亚洲成人av在线| 国产成人精品综合久久久| 久久av中文字幕| 亚洲国产成人精品久久| 亚洲女人天堂网| 深夜精品寂寞黄网站在线观看| 68精品久久久久久欧美| 精品中文字幕视频| 九色91av视频| 成人xvideos免费视频| 久久在线免费观看视频| 一本一道久久a久久精品逆3p| 国产丝袜精品第一页| 日韩欧美一区视频| 欧美精品成人91久久久久久久| 日韩一区二区三区在线播放| 久久久久成人精品| 一区二区三区美女xx视频| 欧美激情综合亚洲一二区| 欧美一级片一区| 欧美韩日一区二区| 久久99精品久久久久久琪琪| 欧美色欧美亚洲高清在线视频| 尤物tv国产一区| 亚洲人成网在线播放| 在线观看日韩视频| 亚洲第一页自拍| 国产精品免费福利| 亚洲男人av在线| 97在线观看视频国产| 国产精品极品尤物在线观看| 66m—66摸成人免费视频| 色伦专区97中文字幕| 日韩女在线观看| 亚洲sss综合天堂久久| 日韩中文字在线| 欧美理论电影在线观看| 国产精品海角社区在线观看| 久久精品99久久久久久久久| 亚洲欧美综合图区| 成人h视频在线观看播放| 日韩精品免费一线在线观看| 美日韩精品免费视频| 久久天天躁狠狠躁夜夜躁2014| 亚洲国产精品久久精品怡红院| 国产精品久久国产精品99gif| 68精品久久久久久欧美| 57pao国产成人免费| 日韩电影第一页| 精品久久久久久久久久国产| 日韩av在线播放资源| 日韩三级影视基地| 51色欧美片视频在线观看| 国产成人av在线播放| 国产精品久久99久久| 国产精品影片在线观看| 亚洲精品97久久| 久久精品99无色码中文字幕| 亚洲精品视频免费在线观看| 国产91精品久久久久久| 欧美一区三区三区高中清蜜桃| 国产美女久久精品香蕉69| 日韩在线视频观看| 国产精品亚洲精品| 国内精久久久久久久久久人| 在线亚洲午夜片av大片| 成人夜晚看av| 成人免费xxxxx在线观看| 欧美成人免费在线观看| 亚洲欧美中文在线视频| 最近2019年手机中文字幕| 亚洲人成电影网| 自拍偷拍免费精品| 全亚洲最色的网站在线观看| 日韩美女毛茸茸| 久久影院中文字幕| 久久影视电视剧免费网站清宫辞电视| 欧美黑人极品猛少妇色xxxxx| 日韩视频第一页| 亚洲精品久久视频| www.日韩欧美| 97精品伊人久久久大香线蕉| 久久91精品国产| 亚洲天堂第一页| 国产福利精品av综合导导航| 精品国产一区二区三区久久狼5月| 91精品啪aⅴ在线观看国产| 久久亚洲国产精品成人av秋霞| 久久99久国产精品黄毛片入口| 日韩欧美国产网站| 亚洲精品按摩视频| 韩国精品久久久999| 国产亚洲精品激情久久| 亚洲国产91色在线| 日韩成人在线电影网| 亚洲精品短视频| 91精品国产乱码久久久久久蜜臀| 欧洲中文字幕国产精品| 97超级碰碰碰| 成人写真视频福利网| 91av在线看| 亚洲国产精品电影| 亚州国产精品久久久| 日韩欧美国产成人| 日韩高清欧美高清| 成人在线国产精品| 亚洲欧美成人在线| 黑人巨大精品欧美一区二区一视频| 国产精品99导航| 日本欧美一二三区| 亚洲人av在线影院| 欧美福利在线观看| 亚洲人成电影在线播放| 欧美一区二区视频97| 亚洲精品成人免费| 亚洲偷熟乱区亚洲香蕉av| 欧美老女人www| 国产欧美精品一区二区三区介绍| 成人精品在线视频| 欧美疯狂性受xxxxx另类| 欧美成人免费一级人片100| 国产97在线视频| 久久久99免费视频| 中文字幕亚洲一区| 777午夜精品福利在线观看| 亚洲自拍另类欧美丝袜| 91国产视频在线播放| 久久大大胆人体| www.美女亚洲精品|