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