详解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插件Tmpl的简单使用方法
Apr 27 Javascript
jquery淡入淡出效果简单实例
Jan 14 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
Angular.js中上传指令ng-upload的基本使用教程
Jul 30 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
js实现网页同时进行多个倒计时功能
Feb 25 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
Vue 理解之白话 getter/setter详解
Apr 16 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 Javascript
js实现跳一跳小游戏
Jul 31 Javascript
vue前端工程的搭建
Mar 31 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
python计算N天之后日期的方法
2015/03/31 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python如何实现动态数组
2019/11/02 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
Python操作Excel的学习笔记
2021/02/18 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
什么是规则表达式
2012/05/03 面试题
大学四年个人自我小结
2014/03/05 职场文书
农村改厕实施方案
2014/03/22 职场文书
暑期教师培训方案
2014/06/07 职场文书
2014年体育工作总结
2014/11/24 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
建党伟业观后感
2015/06/01 职场文书
庆元旦主持词
2015/07/06 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android