阅读 214
每天一题,every

每天一题,every

每天一题,坚持思考

题目

实现every函数,通过函数检查数组中每一个元素是否都返回真值。一旦返回假值,那么久终止遍历数组。

every([1, 3, 1, 0, 5], function (item) { return item; }); // false
every([3, 4, 5, 6, 8], function (item, index) { return item > index; });// true
复制代码

具体实现

// 判断参数args是否为数组类型,这里借用Object对象上的toString方法来进行判断
function isArray(args) {
  if (Object.prototype.toString.call(args) === '[object Array]') {
    return true;
  }
}

function every(array, executor, context) {
  // 判断当前array是否为数组并且长度不为0
  if (isArray(array) && array.length) {
    // 判断executor类型为函数
    if (typeof executor === 'function') {
      var index = -1,
          length = array.length;
      // 遍历
      while (++index < length) {
        // 使用call绑定executor函数的this指向和执行函数
        // 如果返回值取反后为false,那么就停止遍历并返回,否则返回true
        if (!executor.call(context, array[index], index, array)) {
          return false;
        }
      }
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}
复制代码

实现思路

参数:

  1. array(Array):被查询的数组;
  2. executor(Function): 每次遍历执行的函数(当前数组成员, 当前索引值, 遍历的数组)
  3. context (*):上下文对象,也就是回调函数中的this绑定的值,默认就是undefined; ;

步骤:

  1. 判断当前的array参数是否为数组,并且判断该数组的长度;
  2. 判断executor的类型是否为函数,如果不是则返回false
  3. 这里使用while遍历,第一次遍历时index的值为0,最后index的值等于数组的长度值;
  4. 最后这里使用call方法绑定executor函数的this,如果context没有传入,那么默认就是undefined,浏览器环境下this指向的是顶级对象,也就是window;调用executor后的返回值如果是true,则继续遍历,否则就会跳出循环,返回false

如果读者发现有不妥或者可以改善的地方,欢迎在评论区指出。如果觉得写得不错或者对你有所帮助,可以点赞、评论、转发分享,谢谢~

文章分类
前端
文章标签