javascript之典型高阶函数应用介绍
JavaScript应用 函数 介绍 典型 高阶
2023-06-13 09:14:43 时间
缘由
虽然以前也使用过javascript语言,但终究是为了配合后端写的一些零零散散的“代码段”,更不能说是javascript项目了。很荣幸的是上个月刚到公司正好碰上项目开始推倒重写,我们team从头开始做架构和实现,目的很清楚,为了改进和超越前面的版本。这是个真正意义上的javascript“项目”,当然服务端不是我们team来负责啦。这也是我真正开始全职使用javascript来编程。由于之前在学校对形式化方法这门课程比较感兴趣,而javascript又是函数式语言,因此我想把更多functional的东西用javascript来表现一下。
几个函数
这几个方法均为javascript1.6数组新增的方法。是很典型的functional函数,当然也非常实用。下面是functional的定义并不来自javascript。
filter:接受一个集合Xs(X表示类型,s表示集合),一个谓词,这个谓词是从X到bool的映射(函数)。然后过虑这个集合,并返回谓词为true的元素组成的集合。下面是简单的实现:
functionfilter(arr,callback){
vari,out=[];
for(i=0;i<arr.length;i++){
if(callback(arr[i]))
out.push(arr[i]);
}
returnout;
}
再加一个简单的测试:
vararr=[1,2,3,4,5,6,7,8,9,10];
vareven=function(item){
if(typeofitem!=="number")returnfalse;
return!(item&1);
};
varfiltered=filter(arr,even);
console.log(filtered);
结果:
2,4,6,8,10
map:接受一个集合Xs,一个函数f,然后把Xs集合中每一个元素按照顺序使用f映射,并返回集合fx1,fx2,fx3...fxn。实现如下:
functionmap(arr,callback){
vari,l=arr&&arr.length||0,out=newArray(l);
for(i=0;i<l;i++)
out[i]=callback(arr[i]);
returnout;
}
测试一下:
vararr=[1,2,3,4,5,6,7,8,9,10];
varaddTen=function(item){
returnitem+10;
};
varmapAdded=map(arr,addTen);
console.log(mapAdded);
结果:
11,12,13,14,15,16,17,18,19,20
另外还有forEach,every和some三个函数在javascript1.6中出现。但在使用过程中感觉还是缺少一个有力的函数,它就是折叠函数(fold)。正所谓map-reduce,有了map而没有"reduce"岂不是很扫兴?下面就来看看这个”reduce“。
Reduce的实现
上面说的reduce其实也就是折叠函数(fold)。它接受一个Xs集合,一个二元操作符f。然后将f插入到集合中的每两个相邻元素之间。举个例子,foldplus[1,2,3,4]意即1+2+3+4。为了更加精确,通常需要一个”起始元素“作为f最开始时的第二个参数。例如foldplus[1,2,3,4]意即(1+(2+(3+(4+0)))。下面是实现:
functionfold(arr,callback,b){
vari,x;
if(b)x=b,i=0;
elsex=arr[0],i=1;
for(;i<arr.length;i++)
x=callback(arr[i],x);
returnx;
}
测试:
vararr=[1,2,3,4,5,6,7,8,9,10];
varplus=function(a,b){
returna+b;
};
varfoldPlus=fold(arr,plus,0);
console.log(foldPlus);
结果:
55
这个函数在ECMAScript5中名字就叫reduce,而函数式里面通常称做fold而已,这是很形象的名字。
总结
其实上面在实现这些functional函数的时候编写风格并不是函数式的,因为javascript语言有具有循环语句。如果没有循环语句呢?留给下一次探索吧。
相关文章
- 用 Javascript 生成二维码
- 【说站】javascript回文是什么
- javascript html转换成markdown,如何使用Turndown使用JavaScript将HTML转换为Markdown[通俗易懂]
- JavaScript案例:简单计算(附计算器)
- JavaScript匿名函数理解及应用[通俗易懂]
- TideSDK:使用 HTML5, CSS3 和 JavaScript 创建多平台的桌面应用
- Javascript客户端脚本的设计和应用
- javascript应用:Iframe自适应其加载的内容高度
- JavaScript应用类库代码
- JavaScript验证浏览器是否支持javascript的方法小结
- 初学js者对javascript面向对象的认识分析
- 防止动态加载JavaScript引起的内存泄漏问题
- JavaScript对象链式操作测试代码
- JavaScript中SQL语句的应用实现
- JavaScript设计模式富有表现力的Javascript(一)
- 一个关于javascript匿名函数的问题分析
- javascript中break,continue和return语句用法小结
- JavaScript面向对象之Prototypes和继承
- javascript面向对象包装类Class封装类库剖析
- 基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
- javascript修改表格背景色实例代码分享
- 小米公司JavaScript面试题
- javascript中字符串拼接详解