Arity是指函数的参数个数,由两个英文后缀-ary和-ity组成:constsum=(a,b)=>a+b;constArity=sum.length;console.log(Arity);//输出结果为2Higher-OrderFunctions高阶函数,此类函数可以接收其他函数作为参数,也可以返回一个函数作为返回值:constfilter=(predFunc,list)=>{constresults=[];list.forEach((listItem)=>{if(predFunc(listItem)){results.push(listItem);}});returnresults;}//过滤函数是传一个函数作为参数//但是没有什么,主要是后面的is函数返回一个函数constis=(type)=>(x)=>Object(x)instanceoftype;//这个函数返回一个函数作为返回值给下面的调用其中filter(is(Number),[0,'1',2,null]);//上面函数调用的结果是[0,2]Partial应用部分函数,??这是预填的在原有功能的基础上(预填充)partoftheparametersandreturnsthenewfunction://下面是一个辅助函数,用来创建partialfunction,下面的函数传入一个函数和这个函数需要的除最后一个参数之外的参数,并返回一个newFunction,即这个新函数的参数是原始函数的最后一个参数//constpartial=(func,...args)=>(...moreArgs)=>func(...args,...moreArgs);//写一个三个数相加的函数constadd3=(a,b,c)=>a+b+c;//预填(add3,2,3)三个参数,空***一个参数,返回一个新函数,重点是返回一个新的函数constfivePlus=partial(add3,2,3);//(c)=>2+3+cfivePlus(4);//=>9CurryingCurryTransformation,函数转换的方法即接收多个参数变成单参数函数,转换后的函数一次只接收一个参数,然后返回一个新函数,新函数可以继续接收参数计数直到接收到所有参数:constsum=(a,b)=>a+b;sum(2,3);//=>6constcurredSum=(a)=>(b)=>a+b;curriedSum(40)(2);//=>42.constadd2=curriedSum(2);//(b)=>2+badd2(10);//=>12个函数组合,接受多个函数作为参数和返回方式一个新功能。新函数按照传入参数的顺序从右到左执行,前一个函数的返回值就是后一个函数的输入值:constcompose=(f,g)=>(a)=>f(g(a));constfloorAndToString=compose((val)=>val.toString(),Math.floor);floorAndToString(121.212121);//=>"121"纯度一个纯函数需要满足两个条件,***是函数的返回值只能由输入值(函数接收到的参数)决定,也就是说纯函数接收到相同的参数后会返回相同的值;运行环境产生副作用(sideeffects),例如,它不改变外部环境变量的值,这被认为是不安全的行为:纯函数示例:constgreet=(name)=>"Hi,"+name;greet("Brianne")//=>"Hi,Brianne"副作用如果函数或表达式在自身作用域之外读写变量数据(mutabledata),那么函数和表达式就会有副作用:letgreeting;constgreet=()=>greeting="Hi,"+window.name;//greet()在执行过程中改变外部环境的变量greet();//=>"Hi,Brianne"//newDate()是可变数据constdifferentEveryTime=newDate();Point-FreeStylepoint-freestyle是一种不显式地向函数传递参数的方法代码风格,通常需要柯里化和高阶函数来实现:constmap=(fn)=>(list)=>list.map(fn);constadd=(a)=>(b)=>a+b;//Notpoints-free//numbers是一个显式传递的参数constincrementAll=(numbers)=>map(add(1))(numbers);//Points-free//add(1)的返回值是隐式传递给定的map,作为列表参数constincrementAll2=map(add(1));Predicate断言,返回布尔值的函数:constpredicate=(a)=>a>2;[1,2,3,4]。filter(predicate);//=>[3,4]Constant常量,初始化后不能再次赋值的数据类型:constfive=5;constjohn={name:'John',age:30};//因为常量Immutable,所以下面的表达式必须是truejohn.age+five===({name:'John',age:30}).age+(5);常量具有引用透明的特性,也就是说,它会在程序中出现的常量被它们的实际值所取代,而不影响程序的结果译者注:其实JavaScript中const声明的常量并不是完全稳定的,用Immutable.js来演示更合适://这里的fromJS()和get()函数都是immutable.js提供的方法constfive=fromJS(5);constjohn=fromJS({name:'John',age:30});john.get('age')+five===({name:'John',age:30}).age+(5);Functorfunctors都有一个map函数,执行map后会返回一个新的functor:object.map(x=>x)===object;object.map(x=>f(g(x)))===object.map(g).map(f);JavaScript中最常见的仿函数是数组类型的实例:[1,2,3].map(x=>x);//=>[1,2,3]constf=x=>x+1;constg=x=>x*2;[1,2,3].map(x=>f(g(x)));//=>[3,5,7][1,2,3]。map(g).map(f);//=>[3,5,7]Liftlift发生在你把值放入函子时,如果你将函数提升到一个ApplicativeFunctor,那么你可以使用这个函数来处理值传递给仿函数。有些lift实现有lift或liftA2函数,方便在functor上执行相关函数:constmult=(a,b)=>a*b;constliftedMult=lift(mult);//=>thisfunctionnowworksonfunctorslikearrayliftedMult([1,2],[3]);//=>[3,6]提升((a,b)=>a+b)([1,2],[3,4]);//=>[4,5,5,6]lift一个参数的函数,和map操作很相似:constincrement=(x)=>x+1;lift(increment)([2]);//=>[3][2].地图(增量);//=>[3]
