關於面試題 Array.indexof() 方法的實現及思考

来源:http://www.cnblogs.com/nzbin/archive/2016/11/05/6033363.html
-Advertisement-
Play Games

這是我在面試大公司時碰到的一個筆試題,當時自己雲里霧裡的胡寫了一番,回頭也曾思考過,最終沒實現也就不了了之了。 昨天看到有網友說面試中也碰到過這個問題,我就重新思考了這個問題的實現方法。 對於想進大公司的童鞋,我想多說兩句,基礎知識真的很關鍵。平時在工作中也深刻體會到,沒有扎實的基礎知識,簡單問題容 ...


這是我在面試大公司時碰到的一個筆試題,當時自己雲里霧裡的胡寫了一番,回頭也曾思考過,最終沒實現也就不了了之了。

昨天看到有網友說面試中也碰到過這個問題,我就重新思考了這個問題的實現方法。

對於想進大公司的童鞋,我想多說兩句,基礎知識真的很關鍵。平時在工作中也深刻體會到,沒有扎實的基礎知識,簡單問題容易複雜化。

因為存在 indexOf 的方法,所以自定義方法寫成 indexof ,方便對比。

對於 Array.indexof() 方法的實現,主要考察的就是原型繼承的知識。

通過 Array.prototype.indexof = function(){} 就可以給 Array 添加一個方法,實際工作中不推薦這樣做。

剩下的就是數組元素匹配的問題,就不多說了,雖然不難,但是做的過程中也遇到了不大不小的問題。

最終代碼如下

Array.prototype.indexof = function(searchElement, fromIndex) {

        var len = this.length;

        // 首先判斷 fromIndex 是否合法
        if (fromIndex == null) {
            fromIndex = 0;
        }
        if (fromIndex < 0) {
            fromIndex = len - 1;
        }

        // 迴圈判斷 searchElement 是否與數組內元素相等
        for (var i = fromIndex; i < len; i++) {
            // 如果相等則返回當前索引值
            if (searchElement === this[i]) {
                return i;
            }
        }

        return -1
}
View Code

測試數組

var arr = ['a', '0', 0, 'a'];

試了試,基本和原生方法差不多,沒有太明顯的bug,但是總覺得自己的代碼有些不夠簡練,邏輯不夠嚴謹。如果文章到此就結束了,顯的有點水。

MDN 的時候看到了一個關於 Array.indexOf() 方法的 polyfill,因為該方法是 ECMAScript 第五版中實現的,所以沒有原生支持的時候就會用如下方法實現。也就是這個問題有了一個官方答案。我認為大家可以先不看官方代碼,自己嘗試著寫一寫,然後再對比答案就會發現自己的不足。

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let o be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of o with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of o with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of o with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}
View Code

仔細看了看官方代碼,思路清晰,邏輯嚴謹,代碼簡潔,再回頭看看自己的代碼,真的不忍直視,實在很慚愧。這個問題不難,但是通過閱讀官方代碼,發現這其中有很多值得學習的地方,尤其是條件判斷是否全面,考慮問題是否周到。我從不敢以程式員自詡,至少現在看來自己還不夠格。解決一個問題很簡單,但是能不能把問題解決好就是能力的體現。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 1.1、國際化簡介 國際化是指應用程式在運行的時候,根據客戶端請求來自的國家地區、語言的不同而顯示不同的界面(簡單說就是根據你的地區顯示相關地區的語言,如果你現在在英國,那麼顯示的語言就是英語),國際化的存在價值就是:當一個應用需要在全球使用。 國際化(Internationalizati ...
  • 1.1概述 提供一個創建一系列或相互依賴對象的介面,而無須指定他們具體的類。這就是抽象工廠模式的定義。 設計某些系統時可能需要為用戶提供一系列相關的對象,但系統不希望用戶直接使用new運算符實例化這些對象,而是應當由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類來創建這些對象,而且還必 ...
  • 一、前言 OGNL和標簽庫的作用,粗暴一點說,就是減少在JSP頁面中出現java代碼,利於維護。 1.1、OGNL 1.1.1、什麼是OGNL? OGNL(Object-Graph Navigation Language):對象圖形導航語言,是一種功能強大的表達式語言,通過簡單的語法,就能夠任意存取 ...
  • 秋招結束了~~,好像偷懶了很久,沒更博了。總結一下自己近來看書的內容。 說明一下,內容大部分來自《高性能網站建設進階指南》。 亂入內容 Web應用和傳統桌面應用有一個共同的目標:儘可能快地響應用戶輸入。 怎樣才算是快?Jakob Nielsen是Web可用性領域知名且備受推崇的專家,引用他的觀點來說 ...
  • 前言 隨著頁面的內容豐富,以及網站體驗更好、性能優化等,原有的通過script標簽引入JavaScript腳本的方式已經不能很好地解決,此時新的一種JavaScript載入方式產生了——延時載入、執行。而js(JavaScript,下同)模塊化可以說是上面延時、執行的一種表示形式。 requirej ...
  • 今天(周六)下午我在公司加班時不知道要乾什麼,就打開公司的一個wordpress項目網站,想看下之前自己做的一個網頁是否有問題。 打開網站首頁,我習慣性的打開了chrome的調試工具,然後滑鼠開始滾動頁面,然後問題就出來了:頁面無法向下滾動,調試工具的console里報了好多undefined的錯誤 ...
  • 一、事件: 1、模式觸發事件: ①DOM:elem.onXXX();只能觸發直接用onXXX綁定的事件處理函數;用addEventistener添加的事件監聽無法模擬出發觸發; ②jQuery:$(...).trigger("事件名");可簡寫:$(...).事件名; 2、頁面載入後執行: ①jQu ...
  • 寫的比較弱,只能處理50道以內的選項為A-D的單選題,正確答案自己輸進去,必須要大寫,不能有空格和逗號,提交會出分,錯誤的題號和答案會console.log()出來. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></ti ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...