Henry-Diasa / awesome_interview_question

总结前端面试题,更贴近于实战,而非背诵的八股文。
11 stars 0 forks source link

map实现 #491

Open Henry-Diasa opened 1 year ago

Henry-Diasa commented 1 year ago
// fn 接受3个参数,element 当前正在处理的元素、index 正在处理的元素在数组中的索引、array 调用了 map() 的数组本身
// map中的第二个参数作为fn函数的this
Array.prototype.selfMap = function(fn, content) {
  if (Object.prototype.toString.call(fn) != '[object Function]') {
    throw new TypeError(`${fn} is not a function `);
  }
  // Array.prototype.map() 函数的第二个参数只有为 null 或 undefined 时,回调函数中的 this 值才会指向全局对象
  if (content === null || content === undefined) {
    content = window;
  }
    let arr = this.slice();
  let list = new Array(arr.length);
  for (let i = 0; i < arr.length; i++) {
    // 跳过稀疏数组
    if (i in arr) {
      // 依次传入this, 当前项,当前索引,整个数组
      list[i] = fn.call(content, arr[i], i, arr);
    }
  }
  return list;
};
let arr = [1, 2, 3];
console.log(arr.selfMap(item => item * 2)); // [2, 4, 6]