美文网首页
87.实现Array.prototype.filter

87.实现Array.prototype.filter

作者: wo不是黄蓉 | 来源:发表于2022-04-06 13:41 被阅读0次

    Array.prototype.filter

    callback必须是一个函数,接收三个参数并且返回一个布尔值。

    如果提供了thisArg参数,它将用作每次调用callbackfn时的this值。如果没有提供,用Undefined代替。

    执行filter方法的步骤:

    image.png
    • 判断传入的回调不是一个函数,抛出异常
    • 创建一个存放结果的数组
    • 遍历数组中的每个元素
    • 如果有第二个参数,则将回调函数的this指向第二个参数,默认为undefined,即this为当前调用对象
    • 调用回调函数,将符合条件的结果进行返回
    //1.实现filter方法
    Array.prototype.filter1 = function (callback, thisArg) {
      if (Object.prototype.toString.call(callback) != "[object Function]")
        return new Error("参数不是一个函数");
      //存放结果
      let result = [];
      //拷贝this
      let array = Object.create(this);
      //thisArg如果有,会被作为callback被调用时的this值,否则this值在非严格模式下将是全局对象
      if (thisArg === undefined) {
        //callback(element[, index[, array]])[, thisArg]
        //为什么不用for循环而是用for...in?
        for (let i = 0; i < array.length; i++) {
          // callback(array[i], i, array);
          //怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
          if (callback(array[i], i, array)) {
            result.push(array[i]);
          }
        }
      } else {
        for (let i = 0; i < array.length; i++) {
          // callback(array[i], i, array);
          //怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
          if (callback.call(array[i], i, array)) {
            result.push(array[i]);
          }
        }
      }
    
      return result;
    };
    

    相关文章

      网友评论

          本文标题:87.实现Array.prototype.filter

          本文链接:https://www.haomeiwen.com/subject/ewjrsrtx.html