详解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 相关文章推荐
理解Javascript_08_函数对象
Oct 15 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
Jul 29 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
Mar 16 Javascript
AngularJS ng-blur 指令详解及简单实例
Jul 30 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
将json转换成struts参数的方法
Nov 08 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
对于input 框限定输入值为浮点型的js代码
Sep 25 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 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
实用函数5
2007/11/08 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python3中property使用方法详解
2019/04/23 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
大学生党性分析材料
2014/12/19 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
宣传稿格式范文
2015/07/23 职场文书