详解JavaScript 高阶函数


Posted in Javascript onSeptember 14, 2020

高阶函数简介

高阶函数 的英文名叫 Higher-Order Function ,是 函数式编程 中的一种。他的表现形式往往是通过把函数作为参数传入另一个函数,或者将函数作为另一个函数的返回值返回。在实际开发业务中, 高阶函数往往可以抽象我们的代码 ,将我们的命令式编程转换为复用性更高级的函数式编程,从而 提升我们的代码质量 。

下面拿3个面试中常问的高阶函数举例子,希望看完以后能够提升大家对JS的理解,提高我们的代码质量。 chat is cheap,show you my code~

Array.map()

功能介绍

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。 map() 方法按照原始数组元素顺序依次处理元素。

tips

注意: map() 不会对空数组进行检测。 注意: map() 不会改变原始数组。

实用意义及代码举例

//如果我们需要将一个数组中,每一项元素全都*2,
  //最基础的作法,是刚学JS时的循环遍历,再每一项中执行*2的操作,例如:
  let arr1 = [0,1,2,3,4,5,6];
  let arr2 = [];
  for (let i = 0;i<arr1.length;i++){
    arr2.push(arr1[i]*2)
  }
  console.log(arr2) //[0, 2, 4, 6, 8, 10, 12]
  
  //这样确实可以达到效果,但是这属于命令式编程;
  //换做Map高阶函数的方法实现起来,只需要1行,复用性也会更强。
  
  let arr1 = [0,1,2,3,4,5,6];
  let arr2 = arr1.map((item)=> item*2)
  console.log(arr2) //[0, 2, 4, 6, 8, 10, 12]

总结:

针对数组中每一项都要做的操作,可以实用map方法

Array.reduce()

功能介绍

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。

tips:

注意: reduce() 对于空数组是不会执行回调函数的。

实用意义及代码举例

//如果有一个需求,需要我们将数组中每一项求和
  //实用reduce,可以优雅简洁的实现:
  let arr1 = [0,1,2,3,4,5,6];
  let arr2 = arr1.reduce((prev,cur)=>{ //prev代表之前所有项的最终结果,cur代表当前项的值
    return prev+cur
  },0) //这里的0是初始项传入的值,这里写为0
  console.log(arr2) //21 求和完毕
  
  
  //reduce也可以用于数组去重
  let arr1 = [0,1,2,3,4,5,6,5,6,7,6];
  let arr2 = arr1.reduce((prev,cur)=>{
    //当之前所有项不包含当前项元素时,push,否则直接返回之前所有去重项。
    prev.indexOf(cur) === -1 && prev.push(cur);
    return prev
  },[]) //传入空数组作为初始值
  console.log(arr2) //[0, 1, 2, 3, 4, 5, 6, 7]

总结:

针对数组中所有的项累计计算的操作,最终输入一个值,可以使用reduce方法

Array.filter()

功能介绍

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

tips

注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。

实用代码举例

//例如,需求为获取数组中所有大于等于4的元素,将他们组成一个数组
  let arr1 = [0,1,2,3,4,5,6,5,6,7,6];
  let arr2 = arr1.filter((item)=>{
    return item >= 4
  },[])
  console.log(arr2) //[4, 5, 6, 5, 6, 7, 6]

总结:

对于数组中每一项的筛选功能,可以使用filter方法

Array.flat()

功能介绍

flat() 方法可以将嵌套数组(多为数组)降维,变成低维数组或者一维数组。(数组摊平展开)

tips

注意: 存在一定兼容性问题,例如IE不兼容

实用代码举例

let arr1 = [0,1,2,3,4,5,[1,2,3],[1,2,[1,2,3,4]],6,7,6];
  let arr2 = arr1.flat(1) //flat中传入需要降维的层数,默认是1,如果有个三维数组他会被降级为二位数组,
  let arr3 = arr1.flat(Infinity) //[0, 1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 1, 2, 3, 4, 6, 7, 6] //如果不管是几维数组,需要得到1维数组的话,可以直接使用Infinity 
  console.log(arr2) //[0, 1, 2, 3, 4, 5, 1, 2, 3, 1, 2, [1,2,3,4], 6, 7, 6]

以上就是详解JavaScript 高阶函数的详细内容,更多关于JavaScript 高阶函数的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js实现iframe动态调整高度的代码
Jan 06 Javascript
用javascript getComputedStyle获取和设置style的原理
Oct 10 Javascript
javascript中this做事件参数相关问题解答
Mar 17 Javascript
javascript标签在页面中的位置探讨
Apr 11 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 Javascript
微信小程序 实例应用(记账)详解
Sep 28 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
Vuex模块化实现待办事项的状态管理
Mar 15 Javascript
ES6下子组件调用父组件的方法(推荐)
Feb 23 Javascript
微信小程序实现列表左右滑动
Nov 19 Javascript
vue实现简单计算商品价格
Sep 14 #Javascript
Vue中添加滚动事件设置的方法详解
Sep 14 #Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 #Javascript
swiper自定义分页器的样式
Sep 14 #Javascript
js+canvas实现转盘效果(两个版本)
Sep 13 #Javascript
js实现3D粒子酷炫动态旋转特效
Sep 13 #Javascript
原生JS实现九宫格抽奖
Sep 13 #Javascript
You might like
页面乱码问题的根源及其分析
2013/08/09 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Python深入学习之闭包
2014/08/31 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
财务会计专业求职信范文
2013/12/31 职场文书
草船借箭教学反思
2014/02/03 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技