js原生api之String的slice方法

来源:https://www.cnblogs.com/wangtaoWeb/archive/2018/11/27/10028877.html
-Advertisement-
Play Games

我們在工作中可能會很少進行這樣的思考,對於一些常用的原生api它是如何實現的呢,如果讓我們去用js實現一個與原生api功能相同的函數我們該如何設計演算法去實現呢? 為了鞏固自己的編程技術和提高自己的編程技巧,也為了讓自己對js這門語言有更深刻的理解,我將會把平時開發常用到的各種原生api用自己的方式去 ...


  我們在工作中可能會很少進行這樣的思考,對於一些常用的原生api它是如何實現的呢,如果讓我們去用js實現一個與原生api功能相同的函數我們該如何設計演算法去實現呢? 

  為了鞏固自己的編程技術和提高自己的編程技巧,也為了讓自己對js這門語言有更深刻的理解,我將會把平時開發常用到的各種原生api用自己的方式去實現,如果有錯誤的地方或者代碼運行效率有更好的實現方案歡迎大神指正和批評 

  本次將要實現的第一個方法是Javascript的String基本類型和String對象的常用方法 slice 

  slice的定義和用法 (紅色文字部分摘自菜鳥教程,slice方法)

slice(start, end) 方法可提取字元串的某個部分,並以新的字元串返回被提取的部分。

使用 start(包含) 和 end(不包含) 參數來指定字元串提取的部分。

字元串中第一個字元位置為 0, 第二個字元位置為 1, 以此類推。

提示: 如果是負數,則該參數規定的是從字元串的尾部開始算起的位置。也就是說,-1 指字元串的最後一個字元,-2 指倒數第二個字元,以此類推。 

start:必須. 要抽取的片斷的起始下標。第一個字元位置為 0 

end:可選。 緊接著要截取的片段結尾的下標。若未指定此參數,則要提取的子串包括 start 到原字元串結尾的字元串。

  如果該參數是負數,那麼它規定的是從字元串的尾部開始算起的位置。 

  slice()方法在第一個參數為負數時不管第二個參數為正數還是負數都會返回"";第二個參數為負數時會將負的參數加上字元串的長度。 

 1 var sliceYMWM=function(s,start,end){
 2         // 首先我們的方法得滿足大前提,s必須為String類型或者是String對象的實例
 3         if(typeof(s) == 'string' || s instanceof String){
 4             var slen=s.length;
 5             var aglen=arguments.length;
 6             var res="";
 7             // 我們先處理只用兩個參數 s 和 start 的情況
 8             if(aglen==2){
 9                 if(start>slen){ //此時起始索引大於串長返回空串
10                     return res;
11                 }else if(start>0&&start<slen){
12                     for(let i = start; i<slen; i++){
13                         res+=s[i];
14                     }
15                     return res;
16                 }else{
17                     for(let q = slen+start; q<slen; q++){
18                         res+=s[q];
19                     }
20                     return res;
21                 }
22             }else if(aglen==3){//當三個參數都有的情況
23                 if(start<0){//第一個參數 start 為負數時,都會返回 ""
24                     return res;
25                 }else{
26                     if(end<0){ //當第三個參數 end 為負數時,需要加串長轉換成正序的索引
27                         if(start<end+slen){
28                             for(let j= start; j<end+slen;j++){
29                                 res+=s[j];
30                             }
31                             return res;
32                         }else{ //此時起始索引大於等於結束索引返回空串
33                             return res;
34                         }
35                     }else{ 
36                         if(start<end){ //當結束索引大於串長時,須改良迴圈結構的退出條件,否則當結束索引遠大於串長時會做無用的性能消耗
37                             if(end<slen){
38                                 for(let k=start; k<end;k++){
39                                     res+=s[k];
40                                 }
41                                 return res;
42                             }else{
43                                 for(let k=start; k<slen;k++){
44                                     res+=s[k];
45                                 }
46                                 return res;
47                             }
48                         }else{  //此時起始索引大於等於結束索引返回空串
49                             return res;
50                         }
51                     }
52                 }
53             }else{
54                 throw "參數個數不滿足要求!";
55             }
56         }else{
57             throw "傳入的s並非是字元串類型或者是字元串對象!";
58             
59         }
60     }
61     var s1=new String('倚夢為碼!');
62 var s1_=sliceYMWM(s1,0); //運行結果為 String {"倚夢為碼!"} 63 var s2='倚夢為碼!';
64 var s2_=sliceYMWM(s2,0); //運行結果為 "倚夢為碼!"
65  var s3_=sliceYMWM(s2,-2); // 運行結果為 "碼!"
66   var s4_=sliceYMWM(s2,1,-1) //運行結果為 "夢為碼"
  總結:在用js進行實現slice方法時尤其要註意臨界值的判斷條件,不能少判斷也不能做多餘的判斷防止演算法出現與原生slice方法有結果不一致的情況,而且在進行迴圈條件時應儘量做到不對全局變數的屬性查找之類的操作,因為這種操作的時間複雜度為 O(n) 。

我們可以在第一次對全局變數進行屬性訪問時將其地址存到一個局部變數中,這樣的話只會在第一次進行操作時會對全局變數做屬性搜素,往後只需對局部變數進行訪問,這時演算法複雜度只有 O(1),正所謂的即用即取。有興趣的小伙伴可以自己做做類似的練習。本文為作者  倚夢為碼  原創,歡迎大家觀看和轉載,若有其他用途請註明出處!謝謝合作!

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.問題起源 在平時的業務開發寫CSS中,為了滿足頁面佈局,元素的浮動特性我們用的不能再多了。使用浮動的確能夠解決一些佈局問題,但是也帶了一些副作用影響,比如,父元素高度塌陷,我們有好幾種可以清除浮動的方法,最常用的就是設置父元素的overflow:hidden這個屬性,每次在寫代碼的時候總是這樣寫 ...
  • 網上的相關教程非常多,基礎知識自行搜索即可。 習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。 參考代碼可見: "https://github.com/dashnowords/blogs/tree/master/Structure/graph" 一.圖的基本知識 基本概 ...
  • 轉載請註明出處 @[toc] .attr() 1. .attr() 的四種用法 大致用法: 調用形式:$("xxx").attr(attrName); 獲取匹配到的所有元素中的第一個元素的指定屬性的屬性值. 調用形式:$("xxx").attr(attrName,value): 設置/新增匹配到的所 ...
  • 面試的間隙回頭複習了一下node,感覺node就像一個膠帶,把V8和libuv粘在了一起。 V8毫無疑問,負責解析執行JavaScript,相當於語言層面的橋梁;而libuv則是負責操作系統底層功能的封裝,例如基於IOCP的event loop、file system、non-blockiong n ...
  • • html中的標簽數量是很多的,據人統計大概有300個左右,並且每年都會以20-30個的速度增加著,但是這麼多的標簽我們不必都去記住,因為很多標簽都是不常用的或者可以用基礎的標簽搭配組合,實際上我們需要掌握的大概在30個左右。 • 在前端開發中我們要知道,並不是你用的技術多麼先進就顯得多麼厲害,我... ...
  • 小伙伴們在用vue開發h5項目特別是移動端的項目,很多都是打包後掛載在原生APP上的,那就少不了與原生交互了,我最近就是在坐這個,踩了一些坑,拿出來給大家分享下。 0.通過url傳輸數據:(一般是在入口頁面傳下app的用戶信息進來供vue h5使用) 1.原生APP提供一個介面對象的引用(例如一個掃 ...
  • —————目錄 HTML5基礎 文本控制標記 圖像標記 超鏈接標記 HTML5基礎 文本控制標記 圖像標記 超鏈接標記 1. HTML5 基礎 文檔基本格式 2.文本控制標記 標題和段落標記 3.圖像標記 4.超鏈接標記 ...
  • quill的video模塊插入的是iframe標簽,我們需要的是video標簽。 1、定義自己的video模塊 2、調用: 踩空分割線 最開始寫了下麵的代碼,倒是變成video標簽了,但是不能播放: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...