函数式编程:强调使用纯函数、不可变数据和高阶函数来编写代码 作用: 1.提高代码可读性,更加简洁 2.更容易测试和调试 3.提高代码维护性 4.更好的并发性和并行性 5.更好的抽象和复用
1.纯函数
相同的输入,相同的输出 不会修改除了作用域之外的任何变量
纯函数
function add ( a, b ) {
return a + b;
}
console. log ( add ( 2 , 3 ) ) ;
非纯函数
let count = 0 ;
function increment ( ) {
return ++ count;
}
console. log ( increment ( ) ) ;
2.不可变数据
一旦创建就不可以修改 一般通过创建新的对象或者是数组来实现数据的不可变性
不可变数据
const person = {
name : 'Adela' ,
age : 21
}
const updatedPerson = {
... person,
age : 22
}
console. log ( person) ;
console. log ( updatedPerson) ;
3.高阶函数
可以接受函数作为参数挥着返回函数的函数 常见的高阶函数有 map、filter、reduce 等
function map ( array, fn ) {
const result = [ ] ;
for ( let i = 0 ; i < array. length; i++ ) {
result. push ( fn ( array[ i] ) )
}
return result;
}
const numbers = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ;
const doublenumbers = map ( numbers, ( x ) => x * 2 ) ;
console. log ( doublenumbers) ;
4.函数组合
多个函数串联,组成一个新的函数 compose或pipe函数实现函数组合
const parseJson = ( data ) => {
try {
return JSON . parse ( data) ;
} catch ( error) {
console. error ( 'Error parsing JSON:' , error) ;
return null ;
}
} ;
const getProperty = ( obj, prop ) => obj[ prop] ;
const compose = ( ... fns) => ( x, ... args ) => fns. reduceRight ( ( v, f ) => f ( v, ... args) , x) ;
const getUserName = compose ( getProperty, parseJson)
const userData = '{"name":"Adela"}' ;
const userName = getUserName ( userData, 'name' ) ;
console. log ( userName) ;
5.柯里化
将一个需要多个参数的函数分解成多个函数,每个函数只接受一个参数
常规的加法函数
const add = ( a, b ) => a + b;
console. log ( add ( 2 , 3 ) ) ;
进行柯里化后
const add = a => b => a + b;
const add5 = add ( 5 ) ;
console. log ( add5 ( 3 ) ) ;
console. log ( add5 ( 10 ) ) ;