函數式編程徹底改變你的編程思維,快來看看怎麼用

函數式編程的顯著標志是不會對程序有“副作用”(side effect)。因為它不會改變函數外部的數據,也不依賴函數外部的數據。

舉個例子:非函數編程的代碼

let a = 0;let test = function(){ a=a+1;}

改寫為函數式編程代碼

let test = function(a){ return a+1;}

函數式編程徹底改變你的編程思維,快來看看怎麼用

函數式編程利刃(1)--Map

Map是由一個函數和一個元素集合組成。它會生成一個新的空數組,在原數組的每一個元素上執行函數,並把返回值插入到這個新數組中。Map的返回值就是這個新數組。

我們舉個例子:返回平方數

let square = map(lambda x : x * x , [1,2,3,4]);console.log(square); //[1,4,9,16]

這樣的好處就是再也不用也循環來處理了,循環是非常影響性能的,尤其當迭代次數多了以後,執行的速度會明顯下降。


函數式編程利刃(2)--Reduce

Reduce和Map的組成類似,也是也和函數和一個數組,但是它的返回值是這個數據的聚合值。

舉個例子:求和運算

let sum = reduce(lambda a,x : a + x, [0,1,2,3,4]);console.log(sum); //10

x是當前被執行的元素,a是上次迭代運算的結果。reduce將遍歷所有元素並返回聚合的結果。當執行第一個元素時,第一個元素會被賦值給a,第二個元素會被賦值給x。

為什麼map和reduce更好?

1.代碼簡潔,它們通常是一行代碼就搞定。(一般而言:代碼越少,出錯的概率就越少)

2.結構統一,map和reduce的原數組,操作函數,返回值的位置結構都是一樣的。

3.函數式編程,相較於循環,它們不會影響上下文定義的變量,同樣減少了bug。

4.易於理解,不同於循環中的複雜結構,閱讀者很容易理解代碼的意圖。

5.提供原生方法,filter,all,any,find.(又能少寫好多代碼了)


函數式編程利刃(4)--狀態

理解不深,不敢妄談。類似於遞歸函數,如果狀態不滿足結束的條件就不斷進行運算和條件篩選。

函數式編程利刃(5)--管道

這個很好理解,就是把上個函數的結果傳給下一個函數處理,像管道一樣一次傳遞,最終得出結果。


總結

1.用map和reduce替換循環。

2.將代碼分割為函數,語義化函數名。

3.將操作轉化為管道


分享到:


相關文章: