高阶函数

作者: Dl_毛良伟 | 来源:发表于2017-07-26 23:37 被阅读18次

filter()

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

语法

var new_array = arr.filter(callback[, thisArg])

参数

callback

用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
返回true表示保留该元素(通过测试),false则不保留。

thisArg

可选。执行 callback 时的用于 this 的值。

原理

为数组中的每个元素调用一次 callback函数,并利用所有使得 callback 返回 true 或 (等价于 true 的值)的元素创建一个新数组。callback只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback测试的元素会被跳过,不会被包含在新数组中

var filtered = [12, 5, 8, 130, 44].filter(item => item >= 10);
// filtered is [12, 130, 44]

map()

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果.

语法

let array = arr.map(function callback(currentValue, index, array) { 
    // Return element for new_array 
}[, thisArg])

参数

callback

生成新数组元素的函数,使用三个参数:

  • currentValue
    callback 的第一个参数,数组中正在处理的当前元素。
  • index
    callback 的第二个参数,数组中正在处理的当前元素的索引。
  • array
    callback 的第三个参数,map 方法被调用的数组。
thisArg

可选的。执行 callback 函数时 使用的this 值。

原理

  • map方法会给原数组中的每个元素都按顺序调用一次 callback
    函数。callback
    每次执行后的返回值(包括 undefined
    )组合起来形成一个新数组。 callback
    函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete
    删除的索引则不会被调用。

  • callback函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
    如果 thisArg参数有值,则每次 callback函数被调用的时候,this都会指向 thisArg参数上的这个对象。如果省略了 thisArg 参数,或者赋值为 null或 undefined,则 this 指向全局对象 。

  • map不修改调用它的原数组本身(当然可以在 callback
    执行时改变原数组)。
    使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9]

Apply()

apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。

语法

fun.apply(thisArg, [argsArray])
参数
  • thisArg
    fun 函数运行时指定的 this值。需要注意的是,指定的 this值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null或 undefined时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this会指向该原始值的自动包装对象。
  • argsArray
    一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun函数。如果该参数的值为null或 undefined,则表示不需要传入任何参数。
原理
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。唯一区别是apply接受的是数组参数,call接受的是连续参数。

function add(j, k){
    return j+k;
}

function sub(j, k){
    return j-k;
}

我们在控制台运行:

add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8

sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2

通过call和apply,我们可以实现对象继承。示例:

var Parent = function(){
    this.name = "yjc";
    this.age = 22;
}

var child = {};

console.log(child);//Object {} ,空对象

Parent.call(child);

console.log(child); //Object {name: "yjc", age: 22}

以上实现了对象的继承。
在这里推荐一篇文章[深入学习JavaScript: apply 方法]

reduce()

对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。

语法

array1.reduce(callbackfn[, initialValue])

参数

参数 定义
array1 必需。一个数组对象。
callbackfn 必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。
initialValue 可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供。

案例:来自github上面的练习题[collection-calculate-camp]

'use strict';
var compute_average = require('../../practices/reduce/compute_average.js');

describe('compute_average', function () {

  var collection = [1, 3, 5, 98, 67, 453];

  iit('计算给定数字集合元素的平均值', function () {

    var result = compute_average(collection);
    expect(result).toEqual(104.5)
  });
});
'use strict';

function compute_average(collection) {

  return collection.reduce((a, b) => a + b)/collection.length;
}

module.exports = compute_average;

相关文章

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

  • Day10. 高阶组件

    1. 认识高阶函数 什么是高阶组件呢?认识高阶函数.png 高阶函数: 接收一个或多个函数作为输入, 输出一个函数...

  • Python高阶函数

    本文要点 1.什么是高阶函数 2.python中有哪些常用的高阶函数 什么是高阶函数? 在了解什么是高阶函数之前,...

网友评论

  • rangel:整理资料是一个更好的学习输出方式吗
    rangel: @rangel 嘛
  • rangel:在粘代码之前可以去jsbeautiful网站上去格式化一下代码,这样粘过来会很整齐
    Dl_毛良伟: @rangel 👌,谢谢学姐,其实我发现这样做,有点多此一举,以后要找资料直接在网上找就好了,像我这样做,有点浪费时间了

本文标题:高阶函数

本文链接:https://www.haomeiwen.com/subject/bjrakxtx.html