服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

面试官:indexOf 和 findIndex 的区别?

日期: 来源:程序员成长指北收集编辑:

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

indexOffindIndex 都是查找数组中满足条件的第一个元素的索引

indexOf

Array.prototype.indexOf():

indexOf() 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

来自:MDN

例如:

const sisters = ['a', 'b', 'c', 'd', 'e'];
console.log(sisters.indexOf('b'));
// 1

请注意:indexOf() 使用严格等号(与 === 或 triple-equals 使用的方法相同)来比较 searchElement 和数组中的元素

所以,indexOf 更多的是用于查找基本类型,如果是对象类型,则是判断是否是同一个对象的引用

let sisters = [{a: 1}, {b: 2}];
console.log(sisters.indexOf({b: 2}));
// -1

const an = {b: 2}
sisters = [{a: 1}, an];
console.log(sisters.indexOf(an));
// 1

findIndex

Array.prototype.findIndex():

findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。

来自:MDN

const sisters = [10, 9, 12, 15, 16];
const isLargeNumber = (element) => element > 13;
console.log(sisters.findIndex(isLargeNumber));
// 3

findIndex 期望回调函数作为第一个参数。如果你需要非基本类型数组(例如对象)的索引,或者你的查找条件比一个值更复杂,可以使用这个方法。

indexOf 与 findIndex 区别(总结)

  • indexOf :查找值作为第一个参数,采用 === 比较,更多的是用于查找基本类型,如果是对象类型,则是判断是否是同一个对象的引用

  • findIndex :比较函数作为第一个参数,多用于非基本类型(例如对象)的数组索引查找,或查找条件很复杂

源码实现(加深)

indexOf

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);
    var len = O.length >>> 0;
    if (len === 0) {
      return -1;
    }

    var n = +fromIndex || 0;
    if (Math.abs(n) === Infinity) {
      n = 0;
    }
    if (n >= len) {
      return -1;
    }
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    while (k < len) {
      if (k in O && O[k] === searchElement) { // === 匹配
        return k;
      }
      k++;
    }
    return -1;
  };
}

findIndex

if (!Array.prototype.findIndex) {
  Object.defineProperty(Array.prototype, 'findIndex', {
    value: function(predicate) {
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);
      var len = o.length >>> 0;

      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      var thisArg = arguments[1];

      var k = 0;
      while (k < len) {
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) { // 比较函数判断
          return k; 
        }
        k++;
      }

      return -1;
    }
  });
}

来源:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/451

      
Node 社群



我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。



如果你觉得这篇内容对你有帮助,我想请你帮我2个小忙:

1. 点个「在看」,让更多人也能看到这篇文章
2. 订阅官方博客 www.inode.club 让我们一起成长

点赞和在看就是最大的支持❤️

相关阅读

  • 可以实现一个前端的 Excel 导入和导出功能吗?

  • 大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群前言【**负责人 A】:现在报表部分基于接口的 Excel 的导入和导出功能有点慢,前端这
  • Vue3 Table 性能优化,减少 85% 渲染耗时

  • 大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群原文链接: https://juejin.cn/post/7194516447932973112作者:dev_zuo前段时间公司
  • 新年话安全(速领2023限定红包封面)

  • ·文末有惊喜!领取限定版阿里云安全2023新春红包封面。数量有限,先到先得!····················究竟什么是安全?1000个人心中有1000种定义是责任、是义务,也
  • 基于AD Event日志监测AdminSDHolder

  • 01、简介AdminSDHolder是一个特殊的AD容器,通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和
  • 委员单位动态|第九届数慧新年大讲堂即将召开

  • 由委员单位上海数慧主办的“2023第九届数慧新年大讲堂”将于2023年2月17、18日(周五、周六)在广州线下+云端同步召开,诚邀各位同仁莅临参加!会议时间2023年2月17日(全天)2023年2月

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 面试官:indexOf 和 findIndex 的区别?

  • 大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群indexOf 与 findIndex 都是查找数组中满足条件的第一个元素的索引indexOfArray.pr
  • 前方高能,2022版前端面试上岸手册,一鸣惊人!

  • 大裁员背景下,没什么比辞职后找不到工作更扎心!在行情好转前,前端程序员只能“猥琐发育”,不轻易跳槽,同时要修炼内功:对八股文、底层源码、重点项目等进行查缺补漏,静待行情好转抓
  • 可以实现一个前端的 Excel 导入和导出功能吗?

  • 大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群前言【**负责人 A】:现在报表部分基于接口的 Excel 的导入和导出功能有点慢,前端这
  • Vue3 Table 性能优化,减少 85% 渲染耗时

  • 大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群原文链接: https://juejin.cn/post/7194516447932973112作者:dev_zuo前段时间公司