面試官問:indexOf 和 findIndex 的區別

2022-01-04 前端瓶子君


indexOf 與 findIndex 都是查找數組中滿足條件的第一個元素的索引

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

最後歡迎關注「三分鐘學前端」,回復「交流」自動加入前端三分鐘進階群,每日一道編程算法面試題(含解答),助力你成為更優秀的前端開發!

相關焦點

  • JavaScript進階-手撕lodash之findIndex和findLastIndex
    和findLastIndex方法。1. findIndex_.findIndex(array, [predicate=_.identity], [fromIndex=0])該方法返回第一個通過 predicate 斷言函數判斷為真值的元素的索引值(index)參數array  (Array) : 要搜索的數組。
  • 前端開發:JS中查找數組的目標元素方法(find()、findIndex())的使用
    本篇博文來分享一下關於查找數組裡面的目標元素的方法,那麼就用到了JS中find()方法和findIndex()方法的使用。 首先來了解一下,在前端ES6語法中對於數組的操作,新增了兩個方法:find()方法和findIndex()方法,都是用來解決查找數組中的目標元素而產生的。
  • JavaScript 數組中的 indexOf 方法詳解
    String 類型的使用溫習一下大家熟知的字符串用法,舉個例子let str = 'orange';str.indexOf('o');  //0str.indexOf('n');  //3str.indexOf('c');  //-1這裡 0 和 3 分別是 o 和 n 在字符串中出現的位置。起始下標是 0。
  • 面試官:有了for循環 為什麼還要forEach?
    js中那麼多循環,for for...in for...of forEach,有些循環感覺上是大同小異今天我們討論下for循環和forEach的差異。我們從幾個維度展開討論:本質區別for循環是js提出時就有的循環方法。
  • 【每天一學】JavascriptString.lastIndexOf()方法
    <body><script type="text/javascript">var str1 = new String( "This is string one and again string" );var index
  • nofollow,noindex,noachive在網站seo優化中的應用
    不光是nofollow,還有noindex,noarchive目的都在於針對蜘蛛做友好的引導,同時也是有目的引導,以求給雙方帶來更好的價值和體驗。nofollow,noindex,noachive在網站seo優化中的應用什麼是nofollow?故名思義,告訴搜尋引擎,這個連結別跟蹤。
  • excel經典函數組合:index+match!工作中非常實用,案例解析掌握
    課程信息卡課程:《Excel天天訓練營》2.0圖文版章節:第2章-精通函數內容:定位查找(index\match)在excel函數裡面,index+match這一組函數做定位查找是非常實用的。通過index+match這一組函數就可以定位到兩個數據的交叉位置,即查詢結果。如果你沒有學會這些函數,那麼就無法應對大量數據的表格。現在,我們就來用函數公式實現excel自動化辦公。
  • 【JavaScript 教程】第五章 字符串07— indexOf():獲取字符串中子字符串第一次出現的索引
    ;let substr = 'know';let count = 0;let index = str.indexOf(substr);while(index !3) indexOf() 和區分大小寫indexOf() 區分大小寫。
  • ...管理與工程學院講座預告 | An Index-based Dynamic Mechanism
    We propose a sustainability index that reflects the supplier's compliance status, and then construct a dynamic mechanism to achieve the first-best index in each period.
  • 【大牛你慢英】index的複數形式你都會用嗎?
    (點擊閱讀原文聽慢速英語,漲姿勢)index有複數嗎?The ozone index in this area was down 1 percent.Beijing reported sound air quality in 58 percent of the days last month and only one day of heavy pollution.
  • 手帳新手指南,年曆和檢索(index)的設置及排版
    年曆和檢索在手帳中如同書的目錄,年曆能簡明扼要的展示一年裡的最重要事件,而檢索相當於頁碼,能輕鬆找到我們想找的內容。年曆:年曆一般包含兩類:記錄全年重要日子的年曆和記錄全年重要內容的年曆。Abigail Juliann檢索檢索的設置要確保兩個條件:頁碼和描述。頁碼是檢索的基礎,如果你的手帳本沒有頁碼可以手動添加。在頁面後面描述這一頁內容簡介,就能實現檢索功能啦。
  • 面試官問:「你的興趣愛好是什麼?」這樣回答,面試官最滿意
    1 面試官為什麼要問這道題?面試官時間是很寶貴的,在短短一個小時之內,需要對候選人深入的了解,所以問任何問題都是有目的性的,那面試官問:「你的興趣愛好是什麼?」有什麼目的呢?1) 為了緩和氣氛,讓你為放鬆下來面試的時候,面試官和候選人一直在交鋒,如果一直氣氛很嚴肅,怕候選人進展,進而發揮不好,於是中間會穿插一些輕鬆的話題。
  • 你準備怎麼回答面試官的問題?面試官必問「秘訣」
    自我介紹一定要和簡歷保持一致!請不要自己給自己埋雷!2.不要覺得有些內容簡歷上已經寫過了就不用再重複(面試官可能並沒有那麼多時間去提前熟悉每一位應聘者),自我介紹環節還是要全面但簡潔的介紹自己。4.自我介紹內容不可太簡單,會給人感覺空洞;也不可展開細節說太多,一方面會佔用過長的時間,另一方面,要留給面試官繼續挖掘的餘地。5.自我介紹時該提的亮點、個人能力以及特長都需要提到,因為你永遠不知道面試官會留給你幾分鐘時間,後面還會不會問到你的優勢。謹記!
  • 面試官問:「你的職業規劃是什麼」,究竟在問什麼
    面試官問:「你的職業規劃是什麼」,究竟在問什麼?幾乎每個面試官都會問求職者這個問題,面試官一天的時間非常的緊張,如果這個問題不重要,肯定不會每個人都問的。但很多人就算明白了這個問題很重要,卻總是回答不出讓面試官滿意的答案,嚴重的會直接影響到你入職的成功率,所以阿胖這篇文章,就著重來探討一下面試官問:「你的職業規劃是什麼」,究竟是在問什麼,以及我們該如何應對。
  • 字節跳動三面offer到手,面試官都問了些啥?
    原標題:字節跳動三面offer到手,面試官都問了些啥?     前段時間,我一哥們去面試字節跳動,我聽他說過程艱難,但還是費了九牛二虎之力拿下了。     字節跳動的面試挺有挑戰性的感覺,不過還是挺有趣的,感覺啥技術都問。今天就跟大家說說字節跳動的面經。
  • 搞定HashMap面試,深入講解HashMap的工作原理
    為什麼HashMap深受面試官青睞,我想有這3個原因:常用、基礎線程不安全,容易出問題大廠都在問,自己不問顯得面試官沒水平Hash愛的是每次面試都有它,可以提前做準備,恨的是準備也白準備,依然被滅。這次要做回真正的男人,和它做一個了斷。互虐一次,一勞永逸。我們以天(小)使(白)視角來解剖一下HahsMap。
  • 面試中,面試官問還有什麼要問的,情商低的說沒有,聰明人這樣說
    面試中,面試官問還有什麼要問的,情商低地說沒有,聰明人這樣說面試這個環節是各位求職者在求職工作中非常常見的一個環節,很多人在這個環節很容易出現一些錯誤和問題,而導致自己的面試過程中出現問題。而這些問題的解決方式並不是很複雜的。有時候只需要我們在面對這些問題的時候有一些不錯的思路。
  • 面試官問優缺點,如何回答才能提高面試通過率呢?
    導語:歡迎來到情感的世界,面試官問優缺點,如何回答才能提高面試通過率呢?當面試官問你的優缺點是什麼時,怎麼回答才能提高面試通過率?在正式開始這個話題之前,我們需要了解一下,為什麼面試官會讓每位求職者說出自身優缺點?
  • 面試時,面試官問你有什麼優點和缺點?應該如何巧妙地回答?
    工作多年,被面試過很多次,也面試過很多人,其中有一次印象最深刻,這次我不是主面試官,經理要面試一個候選人,他就拉上了我,作為陪襯,用經理的話說就是撐撐場面, 所以問題的主要是我們經理。當問到一個問題:「你有什麼優點」, 求職者巴拉巴拉說了一堆,然後又問了:「你有什麼缺點?」