Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以坚持,但还是要让自己加油加油。

前两天把我整理的【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)分享给大家啦。

正文内容开始:

1.介绍

个人简单理解为,一个函数可以接收其他函数作为参数,这种函数便称为高阶函数,而主要目的就是为了能接收其他函数作为参数。

Q: 为什么可以接收一个函数作为参数?

A: 因为函数可以接收变量作为参数,而变量可以声明一个方法。

简单实例:

  1. function a (x){
  2. return 'hi ' + x;
  3. }
  4. function f (a, b){
  5. return a(b);
  6. }
  7. f(a, 'leo'); // "hi leo"

这段代码的意思:定义方法f,接收两个参数,方法a和变量b,在方法a中返回一段字符串,当执行方法f并传入参数方法a和参数b的时候,返回"hi leo"

也可以直接调用JS内置方法:

  1. let a = 3, b = -2;
  2. function my_abs (val, fun){
  3. return fun(val);
  4. }
  5. my_abs(a, Math.abs); // 3
  6. my_abs(b, Math.abs); // 2

2.常用高阶函数

2.1 map()

map()方法的作用是:接收一个函数作为参数,对数组中每个元素按顺序调用一次传入的函数并返回结果,不改变原数组,返回一个新数组

通常使用方式:arr.map(callback()),更多详细介绍可以参考 MDN Array.map()

参数

  • arr : 需要操作的数组;
  • callback(currentValue, index, array, thisArg) : 处理的方法,四个参数;
      1. currentValue 当前处理的元素的
      1. index 当前处理的元素的索引,可选
      1. array 调用map()方法的数组,可选
      1. currentVthisArgalue 执行 callback 函数时使用的 this 值,可选

返回值

返回一个处理后的新数组。

实例

  1. let arr = [1, 3, -5];
  2. let a1 = arr.map(Math.abs);
  3. // a1 => [1, 3, 5];
  4. let a2 = arr.map(String);
  5. // a2 => ["1", "3", "-5"]
  6. let a3 = arr.map(function (x){
  7. return x + 1;
  8. })
  9. // 等价于 a3=arr.map(x => x+1)
  10. // a3 => [2, 4, -4]

对比 for...in 循环,map()书写起来更加简洁:

  1. let arr = [1, 3, -5];
  2. let a1 = [];
  3. for (var i=0; i<arr.length; i++){
  4. a1.push(arr[i] + 1);
  5. }
  6. // a1 => [2, 4, -4]

map()作为高阶函数,事实上它把运算规则抽象了。

2.2 reduce()

reduce()方法的作用是:接收一个函数,对数组进行累加操作,把累计结果和下一个值进行操作,最后返回最终的单个结果值。

通常使用方式:arr.reduce(callback(), initValue),更多详细介绍可以参考 MDN Array.reduce()

参数

  • callback(returnValue, currentValue, currentIndex, array) : 累记器的方法,四个参数:

      1. returnValue 上一次处理的返回值,或者初始值
      1. currentValue 当前处理的元素的,可选
      1. currentIndex 当前处理的元素的索引,可选
      1. array 调用reduce()方法的数组,可选
  • initValue 初次调用callback()时候returnValue参数的初始值,默认数组第一个元素,可选

返回值

返回一个最终的累计值。

实例

  1. 数组求和
  1. let arr = [1, 3, -5];
  2. let sum1 = arr.reduce((res, cur) => res + cur);
  3. // sum1 => -1
  4. let sum2 = arr.reduce((res, cur) => res + cur , 1);
  5. // sum1 => 0
  1. 二维数组转化为一维
  1. let arr = [[1, 2], [3, 4], [5, 6]];
  2. let con = arr.reduce((res, cur) => res.concat(cur));
  3. // con => [1, 2, 3, 4, 5, 6]

2.3 filter()

filter()方法的作用是:接收一个函数,依次作用数组每个元素,并过滤符合函数条件的元素,将剩下的数组作为一个新数组返回。

通常使用方式:arr.filter(callback(), thisArg),更多详细介绍可以参考 MDN Array.filter()

参数

  • callback(ele, index, array) : 过滤条件的方法,当返回true则保存该元素,反之不保留,三个参数:

      1. ele 当前处理的元素
      1. index 当前处理的元素的索引,可选
      1. array 调用filter()方法的数组,可选
  • thisArg 执行 callback 时的用于 this 的值,可选

返回值

返回一个过滤剩下的元素组成的新数组。

实例

  1. 过滤奇数值
  1. let arr = [1, 2, 3, 4, 5, 6];
  2. let res = arr.filter(x => x % 2 != 0);
  3. // res => [1, 3, 5]
  1. 过滤不满足条件的值
  1. let arr = [1, 2, 3, 4, 5, 6];
  2. let res = arr.filter(x => x > 3);
  3. // res => [4, 5, 6]
  1. 过滤空字符串
  1. let arr = ['a', '', null, undefined, 'b', ''];
  2. let tri = arr.filter(x => x && x.trim());
  3. // tri => ["a", "b"]

总结下: filter()主要作为筛选功能,因此核心就是正确实现一个“筛选”函数。

2.4 sort()

sort()方法的作用是:接收一个函数,对数组的元素进行排序,并返回排序后的新数组。默认排序顺序是根据字符串Unicode码点

通常使用方式:arr.sort(fun()),更多详细介绍可以参考 MDN Array.sort()

compareFunction 可选

用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

参数

  • fun(a, b) : 指定按某种顺序进行排列的函数,若省略则按照转换为的字符串的各个字符的Unicode位点进行排序,两个可选参数:

    fun() 返回 ab两个值的大小的比较结果,sort()根据返回结果进行排序:
  • fun(a, b) 小于 0 ,则 a 排在 b 前面;
  • fun(a, b) 等于 0 ,则 a b 位置不变;
  • fun(a, b) 大于 0 ,则 a 排在 b 后面;

返回值

返回排序后的新数组,并修改原数组

实例

  1. 升序降序数组
  1. let arr = [1,5,2,3];
  2. let sort1 = arr.sort();
  3. // 等同于 let sort1 = arr.sort((a, b) => a - b);
  4. // sort1 => [1, 2, 3, 5]
  5. let sort2 = arr.sort((a, b) => b - a);
  6. // sort2 => [5, 3, 2, 1]
  1. 字符串排序
  1. let arr1 = ['AA', 'CC', 'BB'];
  2. let sort1 = arr1.sort();
  3. // sort1 => ["AA", "BB", "CC"]
  4. let arr2 = ['AA', 'aa', 'BB'];
  5. let sort2 = arr2.sort();
  6. // sort2 => ["AA", "BB", "aa"]
  7. let arr3 = ['AA', 'aa', 'BB'];
  8. let sort3 = arr3.sort((a, b) => a.toLowerCase() > b.toLowerCase());
  9. // sort3 => ["AA", "aa", "BB"]
  10. // 也可以写成:
  11. let sort3 = arr3.sort((a, b) => {
  12. let s1 = a.toLowerCase();
  13. let s2 = b.toLowerCase();
  14. return s1 > s2 ? 1 : s1 < s2 ? -1 : 0;
  15. })

总结下: sort()主要作为排序功能,因此核心就是正确实现一个“排序”函数。

3. 参考文章

分享的内容比较简单,但是还是希望能帮助到需要的人哈。~~感谢

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推荐 https://github.com/pingan8787/Leo_Reading/issues
ES小册 es.pingan8787.com

【重温基础】JS中的常用高阶函数介绍的更多相关文章

  1. python内置常用高阶函数(列出了5个常用的)

    原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...

  2. Kotlin的高阶函数和常用高阶函数

    Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...

  3. 【Python】高阶函数介绍

    其实函数可以作为变量,之前学过C++,对于这种用法并不奇怪.无非就是函数充当变量,可以传入函数而已. 下面分别介绍 Python 中常见的高阶函数:map/reduce, filter, sorted ...

  4. 5. vue常用高阶函数及综合案例

    一. 常用的数组的高阶函数 假设, 现在有一个数组, 我们要对数组做如下一些列操作 1. 找出小于100的数字: 2. 将小于100的数字, 全部乘以2: 3. 在2的基础上, 对所有数求和: 通常我 ...

  5. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  6. JS的闭包、高阶函数、柯里化

    本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...

  7. Javascript中的高阶函数介绍

    高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...

  8. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  9. Swift高阶函数介绍(闭包、Map、Filter、Reduce)

    Swift语言有非常多函数式编程的特性.常见的map,reduce,filter都有,初看和python几乎相同,以下简介下 闭包介绍: 闭包是自包括的功能代码块,能够在代码中使用或者用来作为參数传值 ...

随机推荐

  1. Salesforce学习之路(十二)Aura组件表达式

    1. 表达式语法 在上篇文章组件属性示例中,新建了一个属性whom, 引用该属性时使用了表达式:{!v.whom},负责该属性的动态输出. 语法:{!expression} 上述示例中,我们的属性名称 ...

  2. nyoj 975-关于521 (EOF)

    975-关于521 内存限制:64MB 时间限制:1000ms 特判: No 通过数:5 提交数:46 难度:2 题目描述: Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览 ...

  3. 高质量App的架构设计与思考!

    最近在做一功能不大.业务也不复杂的小众App,以往做App是发现自己从来没有考虑过一些架构方面的问题,只是按照自己以往的习惯去写代码,忽略了App的设计.本次分享主要包含一些开发App的小经验和技巧, ...

  4. 前端的构建化工具Webpack

    经常看到如jquery-3.0.0.js和jquery-3.0.0-min.js等两相似的文件名. 其实以上两个文件名的内容是一样的,不过带min代表的是占用最小的空间,为项目提高性能.压缩的部分如换 ...

  5. Django使用mysql数据的流程

    创建一个mysql数据库 1.打开终端(cmd): 输入: mysql -uroot -p 密码:*** 输入: create database 数据库名字; 2.在settings中进行配置 DAT ...

  6. Linux\Nginx 虚拟域名配置及测试验证

    使用 Nginx 虚拟域名配置,可以不用去购买域名,就可以通过特定的域名访问本地服务器.减少发布前不必要的开支. 配置步骤 1. 编辑 nginx.conf 配置文件 sudo vim /usr/lo ...

  7. oracle插入,更新,删除数据

    插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...

  8. linux bash编程之算数运算和测试类型(第二篇)

    写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...

  9. day 49

    今日内容 标签操作 样式操作 样式类操作 addClass(); // 添加指定的CSS类名. removeClass(); // 移除指定的CSS类名. hasClass(); // 判断样式存不存 ...

  10. PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)

    content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...