详解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 相关文章推荐
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
Mar 01 Javascript
javascript中的关于类型转换的性能优化
Dec 14 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
Apr 01 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
微信小程序使用wxParse解析html的方法示例
Jan 17 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
vue实现移动端input上传视频、音频
Aug 18 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 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
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
PHP线程的内存回收问题
2016/07/08 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
Python模拟三级菜单效果
2017/09/11 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python将list转为matrix的方法
2018/12/12 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
Python遍历字典方式就实例详解
2019/12/28 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Python短信轰炸的代码
2020/03/25 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
个人承诺书
2014/03/26 职场文书
运动会口号8字
2014/06/07 职场文书
医学求职自荐信
2014/06/21 职场文书
爱护公共设施的标语
2014/06/24 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
实例详解Python的进程,线程和协程
2022/03/13 Python