函數式編程的顯著標志是不會對程序有“副作用”(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.將操作轉化為管道
閱讀更多 前端科技 的文章