手写 Array.prototype.map

题目:实现一个 myMap,等价于原生 Array.prototype.map。

Array.prototype.myMap = function (fn, context) {
  const arr = [].slice.call(this);
  const resArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (!arr.hasOwnProperty(i)) {
      // 稀疏数组:跳过缺失的下标
      continue;
    }
    resArr.push(fn.call(context, arr[i], i, this));
  }

  return resArr;
};

补充

补充:原生 map 在遇到稀疏数组(empty)时 会保留空洞,而普通 forEach 也会跳过空洞。这里用 hasOwnProperty 过滤后再调用回调,行为更接近原生 forEach/map 对稀疏数组的处理。

如果不在意稀疏数组,可以直接 for 循环逐项 push 即可。