forEach()方法对数组的每一个元素执行一次给定的函数。
arr.forEach(function(currentValue, currentIndex, arr) {}, thisArg) //currentValue 必需。当前元素 //currentIndex 可选。当前元素的索引 //arr 可选。当前元素所属的数组对象。 //thisArg 可选参数。当执行回调函数时,用做 this 的值。
Array.prototype._forEach = function(fn, thisArg) { if (typeof fn !== 'function') throw "参数必须为函数"; if(!Array.isArray(this)) throw "只能对数组使用forEach方法"; let arr = this; for(let i=0; i<arr.length; i++) { fn.call(thisArg, arr[i], i, arr) } } // test let arr = [1,2,3,4,5]; arr._forEach((item, index) => { console.log(item, index); }) // test thisArg function Counter() { this.sum = 0; this.count = 0; } // 由于 thisArg 参数(this)传给了 forEach(),每次调用时,它都被传给 callback 函数,做为它的 this 值。 Counter.prototype.add = function (array) { array._forEach(function (entry) { this.sum += entry; ++this.count; }, this); // ^---- Note }; const obj = new Counter(); obj.add([2, 5, 9]); console.log(obj.count); // 3 === (1 + 1 + 1) console.log(obj.sum); // 16 === (2 + 5 + 9)
reduce是一个累加方法,是对数组累积执行回调函数,返回最终计算结果。数组
array.reduce(function(total, currentValue, currentIndex, arr){}, initialValue); //total 必需。初始值, 或者计算结束后的返回值。 //currentValue 必需。当前元素 //currentIndex 可选。当前元素的索引 //arr 可选。当前元素所属的数组对象。 //initialValue可选。传递给函数的初始值
map是遍历数组的每一项,并执行回调函数的操做,返回一个对每一项进行操做后的新数组。
array.map(function(currentValue,index,arr), thisArg); //currentValue 必须。当前元素的值 //index 可选。当前元素的索引值 //arr 可选。当前元素属于的数组对象 //thisArg 可选。对象做为该执行回调时使用,传递给函数,用做 "this" 的值。若是省略了 thisArg,或者传入 null、undefined,那么回调函数的 this 为全局对象。
用reduce实现map方法
Array.prototype.myMap = function(fn, thisArg){ var res = []; thisArg = thisArg || []; this.reduce(function(pre, cur, index, arr){ res.push(fn.call(thisArg, cur, index, arr)); }, []); return res; } var arr = [2,3,1,5]; arr.myMap(function(item,index,arr){ console.log(item,index,arr); }) let res = arr.myMap(v => v * 2); console.log(res); // [4,6,2,10]