從JS中學(xué)習(xí)函數(shù)式編程的五項支柱
一、什么是函數(shù)式編程
從FP函數(shù)式編程的眼中看來,世界的萬事萬物就是處理數(shù)據(jù)流:
- input --> process -- output
FP函數(shù)式編程是一種思維方式:
比如非函數(shù)式,會這樣寫程序:
- > var name = "gaowei";
- > var greeting = "Hello,I'm ";;
- > console.log(greeting + name)
- Hello,I'm gaowei
而函數(shù)范式編程則會這樣寫程序:
- > function greet(name) {
- ... return "Hi, I'm " + name;
- ... }
- > greet("Gaowei");
- "Hi, I'm Gaowei"
二、用純函數(shù) pure-function,避免 副作用 side-effects
舉例說明“非純函數(shù)”,
- > let name = "Gaowei";
- > function greet() {
- ... console.log("Hi, I'm " + name);
- ... }
- > greet()
- Hi, I'm gaowei
這就不是一個純函數(shù),因為沒有返回結(jié)果。
而純函數(shù)則是:
- > function greet(name) {
- ... return "Hi, I'm " + name;
- ... }
三、使用高階函數(shù) higher-order-function,函數(shù)本身可作為輸入或者輸出
在高階函數(shù)中,函數(shù)本身又可作為輸入與輸出。
- > function setAdjectifier(adjective) {
- ... return function(description) {
- ..... return adjective + " " + description;
- ..... }
- ... }
- > let greatifier = setAdjectifier("great");
- > greatifier("meeting")
- 'great meeting'
四、不要迭代,用 map, reduce 和 filter
map與filter之間的關(guān)聯(lián)與區(qū)別,可以參見下面這張圖:
五、不要更改輸入數(shù)據(jù),用不可變更的數(shù)據(jù)結(jié)構(gòu)
舉例,我們慣常的做法常常為:
- > let fruits = ['apple', 'banana', 'peach'];
- > fruits[2] = 'orange'
- 'orange'
- > fruits
- [ 'apple', 'banana', 'orange' ]
上面的mutation的處理方法,將會修改原始數(shù)據(jù)。
嘗試 functional-programming的方式為:
- > newFruits = fruits.map( rm => rm == "orange" ? "peach" : rm)
- [ 'apple', 'banana', 'peach' ]
- > fruits
- [ 'apple', 'banana', 'orange' ]
而能夠高效處理 immutable 數(shù)據(jù)的常用庫為:Mori, immutable.js, Underscor, Lodash, Ramda 等。