全栈工程师

高阶函数

2017-07-26  本文已影响18人  Dl_毛良伟

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

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

thisArg

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

原理

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])
参数
原理
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;
上一篇 下一篇

猜你喜欢

热点阅读