详解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控制css中的float的代码
Aug 16 Javascript
js 格式化时间日期函数小结
Mar 20 Javascript
动态调用CSS文件的JS代码
Jul 29 Javascript
基于Jquery的淡入淡出的特效基础练习
Dec 13 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
详解handlebars+require基本使用方法
Dec 21 Javascript
Bootstrap表单使用方法详解
Feb 17 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 Javascript
教你如何用Node实现API的转发(某音乐)
Sep 20 Javascript
Vue防止白屏添加首屏动画的实例
Oct 31 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
Sep 07 Javascript
如何封装Vue Element的table表格组件
Feb 06 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
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
解读! Python在人工智能中的作用
2017/11/14 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
枚举与#define宏的区别
2014/04/30 面试题
个人贷款承诺书
2014/03/28 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
六查六看六改心得体会
2014/10/14 职场文书
学前班语言教学计划
2015/01/20 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js