前端實習生面試題分析(二)

来源:http://www.cnblogs.com/isLiu/archive/2017/11/19/7859669.html
-Advertisement-
Play Games

本篇是關於手寫代碼的題目。 1.實現一個trim函數 關於性能的寫法也不多說了,只是用最直觀的寫法來寫一下,使用正則有大概五六種寫法,感興趣可以自己去研究下,推薦《高性能JavaScript》 1.正則實現 trim leftTrim rightTrim 2.非正則實現 trim leftTrim ...


本篇是關於手寫代碼的題目。

1.實現一個trim函數

關於性能的寫法也不多說了,只是用最直觀的寫法來寫一下,使用正則有大概五六種寫法,感興趣可以自己去研究下,推薦《高性能JavaScript》

1.正則實現

  • trim

       String.prototype.trim = function () {
          return this.replace(/(^\s*)|(\s*$)/g, "");
      }
  • leftTrim

       String.prototype.leftTrim = function () {
          return this.replace(/(^\s*)/g,"");
      }
  • rightTrim

       String.prototype.rightTrim = function () {
          return this.replace(/(\s*$)/g,"");
      }

2.非正則實現

  • trim

    String.prototype.trim = function () {
         var start = 0,         
             end = this.length - 1,
             ws = /\s/          
        while (ws.indexOf(this.charAt(start)) > -1) {
            start ++
        }
        while (end > start && ws.indexOf(this.charAt(end)) > -1) {
            end --
        }
        return this.slice(start, end + 1)   
     }
  • leftTrim

    String.prototype.leftTrim = function () {
        var start = 0,          
             end = this.length - 1,
             ws = /\s/          
        while (ws.indexOf(this.charAt(start)) > -1) {
             start ++
        }
        return this.slice(start, end)
     }
  • rightTrim

    String.prototype.rightTrim = function () {
        var start = 0,          
             end = this.length - 1,
             ws = /\s/          
        while (end > start && ws.indexOf(this.charAt(end)) > -1) {
            end --
        }
        return this.slice(start, end + 1)
     }

3.混合實現

當字元串的末尾只有一小段空白時候,正則表達式會陷入瘋狂工作狀態;而通過迴圈遍歷字元串的效率也比不上正則表達式,所以有了這種混合模式

    String.prototype.trim = function () {
        var str = this.replace(/^\s+/, '')
                end = str.length - 1
                ws = /\s/
        while (ws.test(str.charAt(end))) {
            end --
        }
        return str.slice(0, end + 1)
 }

2.call、apply、bind之間的區別

總之三種方法都是改變函數內this的指向

1.fn.call (context, arg1, arg2, .....)

call中第一個參數是fn的上下文,剩下的參數就是需要向fn中傳遞的參數

2.fn.apply (context, [args])

apply同call類似,第一個參數也是fn的上下文,和call不同的是,apply第二個參數是數組,call的第二個及第二個以後的參數都是數組裡面的元素

3.fn.bind (context)

bind會創建一個函數,稱之為綁定函數,調用這個函數時,綁定函數會以創建它是bind方法傳入的第一個參數作為自己的上下文,第二個及第二個以後的參數並且加上綁定函數運行時傳遞進來的參數作為原函數的參數來調用原函數。 (有點繞哈,不過對下一道題有幫助)

4.call、apply、bind最大的區別就是bind不會立即調用,會返回一個函數,apply、call會立即調用。


3.用call或者apply實現一個bind函數

看看上面的bind定義吧,不多說了

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis || window,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

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

-Advertisement-
Play Games
更多相關文章
  • 一,下載地址:http://ueditor.baidu.com/website/download.html 1)根據需要下載相應版本 例 Java:選擇jsp+utf-8; 二,放置在項目中 1)解壓下載文件,並重命名為editor; 2)複製文件放置在項目webapp目錄下; 3)把editor目 ...
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 比較運算符 當我們對Number作比較時,可以通過比較運算符得到一個布爾值,這是我們預期的結 ...
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 JavaScript的字元串就是用 ' ' 或者 “ ” 括起來的字元表示。 如果字元串內部 ...
  • Vue2.0和1.0實現路由的方法有差別,現在我用Vue 2.0實現路由跳轉,話不多說,直接上代碼 HTML代碼 main.js 代碼 ...
  • Point類除了構造方法,還定義了一個toString方法。註意,定義“類”的方法的時候,前面不需要加上function這個關鍵字,直接把函數定義放進去了就可以了。另外,方法之間不需要逗號分隔,加了會報錯。 Point類除了構造方法,還定義了一個toString方法。註意,定義“類”的方法的時候,前 ...
  • 絮叨絮叨 今天給大家分享一下這兩天自己整理的JavaScript部分的筆記,下麵都是我覺得比較常用的,希望能幫助到大家! 1、 導入JS的三種方式 ①在HTML標簽中,直接內嵌JS。<button onclick=”func()”></button> ②在HTML頁面中使用<script></scr ...
  • 目的:在提交表單之前用JavaScript檢查下是不是圖片文件以及大小 註:match() 方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值(存放匹配結果的數組),而不是字元串的位置。 ...
  • 1)Array.slice方法 1.1)接收兩個參數: a:起始下標 b:結束下標 1.2)返回由a(包括)至b(不包括)的元素所組成的數組,若一個參數都不傳,則返回由全部元素組成的數組。 1.3)該方法執行不影響原數組元素。 1.4)範例圖: 2)Array.splice方法 2.1)接收若幹參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...