高阶函数

作者: 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;
    

    相关文章

      网友评论

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

      本文标题:高阶函数

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