一、數組的 map、filter、reduce 是典型的高階函數,就是接收函數做爲參數的函數;
二、這三個函數都是在Array的原型上;數組
map() 方法建立一個新數組,其結果是該數組中的每一個元素是調用一次提供的函數後的返回值;
arr.map(function callback(currentValue[, index[, array]]),callback 提供了三個參數,當前元素、下標、源數組。ide
Array.prototype.myMap = function (fn) { const that = this; const result = []; const length = that.length; for (let i = 0; i < length; i++) { result.push(fn.call(that, that[i], i, that)) } return result }複製代碼
filter() 方法建立一個新數組, 其包含經過所提供函數實現的測試的全部元素;
arr.filter(callback(element[, index[, array]])[, thisArg]),callback 被調用時傳入三個參數:元素的值、元素的索引、被遍歷的數組自己。函數
Array.prototype.myFilter = function (fn) { const that = this; const result = []; const length = that.length; for (let i = 0; i < length; i++) {const boolean = fn.call(that, that[i], i, that) boolean && result.push(that[i]) } return result }複製代碼
reduce() 方法對數組中的每一個元素執行一個reducer函數,將其結果彙總爲單個返回值;
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]);
callback函數被調用時傳入三四個參數:累計器、當前值、當前索引、源數組;
initialValue 是第一次調用 callback函數時的第一個參數的值。 若是沒有提供初始值,則將使用數組中的第一個元素。 在沒有初始值的空數組上調用 reduce 將報錯。測試
注意點:若是沒有提供 initialValue,reduce 會從索引1的地方開始執行 callback 方法,跳過第一個索引。若是提供 initialValue,從索引0開始。this
Array.prototype.myReduce = function (fn, initialValue) { const that = this; if (that.length === 0) return; let result = initialValue || arr[0]; let startIndex = initialValue ? 0 : 1; const length = that.length; for (let i = startIndex; i < length; i++) { result = fn.call(that, result, that[i], i, that); } return result; }複製代碼