实现一下数组方法 forEach,map,reduce,filter
先写自己实现的想法,可能有疏漏和错误,发现了再更改。
1.forEach
首先了解一下forEach
1 | array.forEach(callback[, thisObject]); |
写个例子观察一下
1 | var arr = [1,2,3]; |
特点:
1)forEach方法接受2个参数,第一个callback,第二个上下文环境
2)callback如果传入是不是方法,提示XX is not a function
3)callback有三个参数,分别是项,下标,和原数组
4)在callback中第三个参数array,如果修改其中的值,会改变原数组
实现
1 | Array.prototype.forEach = function (cb, ctx) { |
2.map
map其实和forEach有点类似
1 | array.map(callback,[ thisObject]); |
写个例子
1 | var arr = [1, 2, 3]; |
特点:
1)map方法接受2个参数,第一个callback,第二个上下文环境
2)callback如果传入是不是方法,提示`XX is not a function
3)callback有三个参数,分别是项,下标,和原数组
4)在callback中第三个参数array,如果修改其中的值,会改变原数组
5)在callback里有return的话,return的值就是新数组的每一项。没有return的话返回一个全是undefined的数组(也就是map会返回一个新数组,所以支持链式调用)
实现
1 | Array.prototype.map = function (cb, ctx) { |
3.reduce
语法:
1 | array.reduce(function(total, currentValue, currentIndex, arr), initialValue) |
写个例子
1 | var arr = [1, 2, 3]; |
特点:
1)reduce方法接受2个参数,一个是callback,一个是初始值initalValue
2)callback有4个参数,分别是总的值,当前的值,下标,和原数组
3)callback如果传入是不是方法,提示`XX is not a function
4)callback函数里返回值会被total保存
5)reduce函数调用会返回total的值
实现:
1 | Array.prototype.reduce = function (cb, initialValue) { |
4.filter
语法:
1 | array.filter(callback,[ thisObject]); |
1)filter方法接受2个参数,一个是callback,第二个是上下文环境
2)callback有3个参数,分别是当前值,下标和原数组
3)会返回一个新数组
4)在callback中第三个参数array,如果修改其中的值,会改变原数组
5)如果callback里有返回值,并且是true,会将当前的值放进数组中
写个例子
1 | var arr = [1, 2, 3]; |
实现:
1 | Array.prototype.filter = function (cb, ctx) { |
看一下MDN上实现的
先说一下Object当以非构造函数形式被调用时,Object 等同于 new Object()。如果参数是符合类型,数据被改变的话,会改变原先的数据
1 | var arr = [1,2,3]; |
1. forEach
1 | Array.prototype.forEach = function (callback, thisArg) { |
2.map
1 | Array.prototype.map = function (callback, thisArg) { |
3.reduce
1 | Object.defineProperty(Array.prototype, 'reduce', { |
4.filter
1 | Array.prototype.filter = function(fun , thisArg) |
总结
forEach和map
共同点:修改callback中的第三个array参数,会改变原数组。
不同点:map支持链式调用,并且会返回一个新数组。而forEach返回undefined。