原生map方法的特点
- map不会对原数组产生影响。
 - map返回的是一个新数组。
 - 一个数组一旦调用map方法,每一个元素都会执行map中的回调函数。
 - map方法会跳过被delete删除或者未定义的元素。
 
原生map接收的两个参数都有什么用?
第一个参数:callback
map接收的第一个参数是一个回调函数,这个参数是必须传入的,callback中有三个可选参数,分别代表着元素,索引和调用map方法的数组,也就是(item,index,arr)。
第二个参数:thisArg(定义执行callback的this指向):可选
第二个参数表示的是callback的this指向。
使用reduce实现map
实现思路主要有以下步骤:
- 首先判断传入的fn是否是一个函数,如果不是则抛出异常。
 - 使用reduce进行拼接调用,最后返回。
 - this指向的是调用map的数组。
 
// 使用reduce实现map
Array.prototype.myMap = function(fn,thisArg=[]) {
  // 如果fn传入的不是一个函数则抛出异常
  if (typeof fn != 'function') {
    throw new Error(`${fn} is not a function`);
  }
  return this.reduce((pre,cur,index,arr) => {
    return pre.concat(fn.call(thisArg,cur,index,arr)); 
  },[])
}
const arr = [2,3,1,5];
const temp = arr.myMap(item => item * 2)
temp  // [4,6,2,10]









