国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

原生js實現(xiàn)replace方法

teren / 1552人閱讀

摘要:今天看到有人提問的方法怎么實現(xiàn)的,自己就試了試手冊里的對象的介紹大概是這樣第一個參數(shù)聲明了要替換的模式的對象。第二個參數(shù)一個字符串,聲明的是替換文本或生成替換文本的函數(shù)。在調(diào)用非全局對象的方法時,返回的數(shù)組與調(diào)用方法返回的方法相同。

今天看到有人提問js的replace方法怎么實現(xiàn)的,自己就試了試
js手冊里的String對象的介紹replace大概是這樣:

</>復(fù)制代碼

  1. string.replace(regexp, replacement)

第一個參數(shù):(regexp)

</>復(fù)制代碼

  1. 聲明了要替換的模式的RegExp對象。如果該參數(shù)是一個字符串,則將它作為要檢索的直接量文本模式,而不是首先被轉(zhuǎn)換成RegExp對象。

第二個參數(shù)(replacement)

</>復(fù)制代碼

  1. 一個字符串,聲明的是替換文本或生成替換文本的函數(shù)。詳見描述部分。

返回值

</>復(fù)制代碼

  1. 一個新字符串,是用replacemenc替換了與regexp的第一次匹配或所有匹配之后得到的。

我就試著實現(xiàn)了下一開始思路沒考慮到正則,有很多問題,經(jīng)過修改過的思路:

使用了正則的exec(),用split將匹配到的字符串作為參數(shù)把原字符串分割成若干數(shù)組,然后將字符串和替換的內(nèi)容連接join起來就實現(xiàn)了

</>復(fù)制代碼

  1. exec()將檢索字符串string,從中得到與正則表達式regexp相匹配的文本。如果exec()找到了匹配的文本,它就會返回一個結(jié)果數(shù)組。否則,返回null。

匹配到的第一個數(shù)組[0]:匹配的文本,

</>復(fù)制代碼

  1. 2個元素是與regexp的第二個子表達式相匹配的文本,以此類推。通常,數(shù)組的length屬性聲明的是數(shù)組中的元素個數(shù)。除了數(shù)組元素和length屬性之外,exec()還返回兩個屬性。index屬性聲明的是匹配文本的第一個字符的位置。input屬性指的就是string。在調(diào)用非全局RegExp對象的exec()方法時,返回的數(shù)組與調(diào)用方法String.match()返回的方法相同。

</>復(fù)制代碼

  1. String.prototype.replaces=function(reg,str){
  2. var arr = [];
  3. var newStr= this;
  4. var i= "";
  5. //循環(huán)到 匹配不到替換的字符串為止
  6. while(reg.exec(newStr)!="null") {
  7. /**使用try,catch是因為在循環(huán)到匹配到所有!=null下次循
  8. 環(huán)reg.exec(newStr)[0]會報錯,循環(huán)完到報錯時直接return結(jié)果**/
  9. try{
  10. arr = newStr.split(reg.exec(newStr)[0]);
  11. newStr = arr.join(str);
  12. //如果該正則式子不是全局正則(/g)不作循環(huán)直接修改一次返回
  13. if(!reg.global){
  14. return newStr;
  15. }
  16. }catch(e){
  17. return newStr;
  18. }
  19. }
  20. }
  21. console.log("我是AbCd啊abcd啊abcd".replaces(/abcd/gi,"lipengpeng"))
  22. ----------------------------------------------------
  23. 經(jīng)過測試,上面代碼存在的問題如下:
  24. 當正則表達式是全局時(/g)時,且只匹配到一個,會直接返回原字符串,
  25. 在循環(huán)reg.exec(newStr)時,每次結(jié)果都不一樣,這里暫時不清楚原因
  26. 修改后的:
  27. String.prototype.replaces=function(reg,str){
  28. var arr = [];
  29. var newStr= this;
  30. var i= "";
  31. var d;
  32. //為了防止reg.exec()每次結(jié)果不一樣,直接賦給一個變量
  33. //這里注意給d=reg.exec()加括號, “=”的優(yōu)先級低
  34. while((d = reg.exec(newStr))!=null) {
  35. try{
  36. arr = newStr.split(d[0]);
  37. newStr = arr.join(str);
  38. if(reg.global){
  39. return newStr;
  40. }else{
  41. break;
  42. }
  43. }catch(e){
  44. console.log(e)
  45. }
  46. }
  47. }

---------------------------------分割線-------------------------------------

以上代碼繼續(xù)測試后,發(fā)現(xiàn)如果正則匹配到不區(qū)分大小寫(/i)且不開啟全局匹配,結(jié)果會全局替換。添加非全局代碼,不用管大小寫在全局或非全局(正則已經(jīng)處理過),最終代碼:

</>復(fù)制代碼

  1. String.prototype.replaces = function(reg, str) {
  2. var arr = [];
  3. var newStr = this;
  4. var i = "";
  5. var d;
  6. while((d = reg.exec(newStr)) != null) {
  7. //debugger
  8. try {
  9. //console.log(d)
  10. if(reg.global) {
  11. arr = newStr.split(d[0]);
  12. newStr = arr.join(str);
  13. } else {
  14. var index = d["index"];
  15. var lastindex = (+index) + (+d[0].length);
  16. var preStr = newStr.slice(0, index);
  17. var nextStr = newStr.slice(lastindex);
  18. newStr = preStr + str + nextStr;
  19. break;
  20. }
  21. } catch(e) {
  22. console.log(e)
  23. }
  24. }
  25. return newStr
  26. }
  27. var s = "我是A,c,a,cc,c,c,cc,a".replaces(/a/ig, "b")
  28. console.log(s)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93621.html

相關(guān)文章

  • 原生js實現(xiàn)replace方法

    摘要:今天看到有人提問的方法怎么實現(xiàn)的,自己就試了試手冊里的對象的介紹大概是這樣第一個參數(shù)聲明了要替換的模式的對象。第二個參數(shù)一個字符串,聲明的是替換文本或生成替換文本的函數(shù)。在調(diào)用非全局對象的方法時,返回的數(shù)組與調(diào)用方法返回的方法相同。 今天看到有人提問js的replace方法怎么實現(xiàn)的,自己就試了試js手冊里的String對象的介紹replace大概是這樣: string.replac...

    Honwhy 評論0 收藏0
  • 14行實現(xiàn)js原生語法前端模板引擎

    最近開發(fā)前端一直用的前端模板引擎; 一直使用的 TPPL 模板引擎 源代碼如下: function tppl(tpl, _data) { tpl = tpl.replace(/()/g, >); var data = _data || {}; if (typeof data !== object) { console.log(TEFinal -> data ...

    hyuan 評論0 收藏0
  • 原生 JS 實現(xiàn) MVVM 框架2——單向綁定

    摘要:上一篇寫了實現(xiàn)框架的一些基本概念本篇用代碼來實現(xiàn)一個完整的框架思考假設(shè)有如下代碼,里面的會和試圖中的一一映射,修改的值,會直接引起試圖中對應(yīng)數(shù)據(jù)的變化如何實現(xiàn)上述呢回想下這篇講的觀察者模式和數(shù)據(jù)監(jiān)聽主題是什么觀察者是什么觀察者何時訂閱主題主 上一篇寫了實現(xiàn) MVVM 框架的一些基本概念 本篇用代碼來實現(xiàn)一個完整的 MVVM 框架 思考 假設(shè)有如下代碼,data里面的name會和試圖中的...

    Zoom 評論0 收藏0
  • 放棄jQuery, 使用原生js

    摘要:隨著的逐漸淘汰,的興起,以及側(cè)重點放在了移動端,可能變的不在那么重要,原生一樣很好用。下面介紹幾個原生替換的方法。 隨著IE6、7、8的逐漸淘汰,HTML5的興起,以及側(cè)重點放在了移動端,jQuery可能變的不在那么重要,原生一樣很好用。下面介紹幾個原生替換jq的方法。 獲取元素 //jQuery $(.xxx); //class獲取 $(#xxx); //id獲取 $(....

    mumumu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<