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;
网友评论