详解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 textarea的长度进行验证
May 06 Javascript
JS小游戏之宇宙战机源码详解
Sep 25 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
Jun 02 Javascript
AngularJS 路由详解和简单实例
Jul 28 Javascript
bootstrap下拉列表与输入框组结合的样式调整
Oct 08 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
vue router导航守卫(router.beforeEach())的使用详解
Apr 19 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
浅析js实现网页截图的两种方式
Nov 01 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 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中通过curl检测页面是否被百度收录
2013/09/27 PHP
php实现微信公众号无限群发
2015/10/11 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
node.js require() 源码解读
2015/12/13 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
python sklearn常用分类算法模型的调用
2019/10/16 Python
keras导入weights方式
2020/06/12 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
会计岗位职责范本
2014/03/07 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
升学宴学生致辞
2015/07/27 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js