阅读 162

前端面试手写题之数组every方法的实现

现如今的前端面试中,常常会考察候选人的编码能力。不仅会考察基本的数据结构与算法,还会考察javascript基本功,看候选人对js基础的理解和掌握程度。

面试官:请你简单实现一下数组方法every

要想实现一个东西,必须要懂这个东西是做什么用的,every的基本功能是遍历一个数组,判断是否所有数组元素满足条件,若全满足返回true,若不满足则返回false,不改变原有数组

every方法接收两个参数,第一个参数是一个函数,第二个参数是改变this指向的值(很多人都没注意到)。 函数接收三个参数,分别为数组每一项、数组的下标以及数组本身。

let arr = [1, 2, 3];
let res = arr.every((item, index, array) => {
  return item === 2
}, thisArg)

// res = false复制代码

懂了every是什么了之后,我们就可以用代码实现他啦~

第一步:把every方法挂载到Array构造函数的原型上来进行模拟,并定义方法的返回值

Array.prototype.myEvery = function () {
  let result = [];
  
  return result;
}复制代码

第二步:确定回调函数的this指向,看是否传了第二个参数

Array.prototype.myEvery = function () {
  let result = [];
  
  let context = arguments[1] || window;
  
  return result;
}复制代码

第三步:判断传的第一个参数是否为函数,若不是则抛出一个错误

Array.prototype.myEvery = function (fn) {
  let result = [];
  
  let context = arguments[1] || window;
  
  if (typeof fn === 'function') {
  
  } else {
    throw new Error('parameter1 is not a function')
  }
  
  return result;
}复制代码

第四步:对数组进行遍历处理

这里使用ES3的call方法调用函数,并指定this指向,依次传入数组项、下标以及数组自身,若有不满足条件的数组项则直接返回false,若全满足则返回true。

Array.prototype.myEvery = function (fn) {
  let result = [];

  let context = arguments[1] || window;
  
  if (typeof fn === 'function') {
    for (let i = 0; i < this.length; i++) {
      let condition = fn.call(context, this[i], i, this)
      if (!condition) {
         return false;
      }
    }
    return true;
  } else {
    throw new Error('parameter1 is not a function')
  }
  
  return result;
}
复制代码复制代码
仅需10行左右代码就完成coding考察了~~~~~~~~:


作者:前端小柴
链接:https://juejin.cn/post/7037670037997486117

 伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
前端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐