Javascript常用的字符串方法

Javascript有很多字符串的方法,有的人有W3C的API,還可以去MDN上去找,但是我覺(jué)得API上說(shuō)的不全,MDN上又太多。。其實(shí)常用的就那幾個(gè),很多都可以用那幾個(gè)方法解出來(lái)。

很多方法中有兼容性的,在使用的時(shí)候,把兼容代碼復(fù)制粘貼即可。

先貼上來(lái)數(shù)組和字符串的方法的比較,我在學(xué)習(xí)的時(shí)候也是會(huì)混。所以做了小總結(jié)。之后就是數(shù)組方法和一些實(shí)例。如果有側(cè)邊欄就好了,看得就比較清楚。

數(shù)組 字符串

slice | slice substring 截取需要開(kāi)始和結(jié)束index的

splice | substr 截取需要開(kāi)始index和截取長(zhǎng)度的

concat | concat 都是連接,一個(gè)是連接數(shù)組,一個(gè)是連接字符串

indexOf | indexOf 搜索元素在不在里面,返回index值或者-1

join | split 這就是兩個(gè)反義詞啊,相互轉(zhuǎn)化的利器

  • 截取方法中,字符串有三種方法slice / substring / substr ,數(shù)組方法有兩個(gè)slice / splice
    其中字符串的slice 和 substring 是要開(kāi)始和結(jié)束的索引,substr 是要開(kāi)始索引和長(zhǎng)度
    數(shù)組的slice是要開(kāi)始和結(jié)束索引,但是splice是要開(kāi)始索引和長(zhǎng)度
  • 搜索元素方法中,數(shù)組和字符串都有indexOf方法,但是字符串多出來(lái)兩種方法charAt和charCodeAt
    其中indexOf是返回索引,charAt是返回索引對(duì)應(yīng)的值,charCodeAt是返回對(duì)應(yīng)值的ASCII碼值。
  • 數(shù)組的遍歷有4中方法,map,every,foreach,some,filter
    其中foreach開(kāi)始就停不下來(lái),全部遍歷。every遍歷一個(gè)就判斷一下,true就繼續(xù)遍歷下一個(gè),false就跳出。map就是邊遍歷邊運(yùn)算。some返回的是布爾值,符合就是true,不符合就是false。filter返回的是符合元素組成的數(shù)組。
  • 增加數(shù)組元素,前面unshift,后面push
    移除數(shù)組元素,前面shift,后面pop
  • 數(shù)組和字符串都有concat方法,各自連接各自的,是數(shù)組就連接到數(shù)組,字符串就連接成字符串
  • 比較重要的兩個(gè)就是數(shù)組和字符串之間的轉(zhuǎn)化的兩個(gè)方法
    join是數(shù)組轉(zhuǎn)字符串,split是字符串轉(zhuǎn)數(shù)組

字符串

查找字符串

charAt(返回字符)

str.charAt(index)

  • charAt()方法從一個(gè)字符串中返回指定的字符

  • index是0 ~ str.length-1 ,如果指定的index值超出了該范圍,則返回一個(gè)空字符串

  • 輸出字符串中不同位置的字符

    
    var anyString = "Brave new world";
    console.log("index 0   is '" + anyString.charAt(0)   + "'");
    console.log("index 1   is '" + anyString.charAt(1)   + "'");
    console.log("index 2   is '" + anyString.charAt(2)   + "'");
    console.log("index 3   is '" + anyString.charAt(3)   + "'");
    console.log("index 4   is '" + anyString.charAt(4)   + "'");
    console.log("index 999 is '" + anyString.charAt(999) + "'");
    
    //輸出
    //  index 0 is 'B'
    //  index 1 is 'r'
    //  index 2 is 'a'
    //  index 3 is 'v'
    //  index 4 is 'e'
    //  index 999 is ''
    

charCodeAt(返回ASCII)

str.charCodeAt(index)

  • 返回索引對(duì)應(yīng)的字符的ASCII表對(duì)應(yīng)的值,0-65535之間的整數(shù),超出范圍返回NaN

  • index : 0 ~ length-1,如果不是一個(gè)數(shù)值,則默認(rèn)為0

    "ABC".charCodeAt(0) // returns 65
    

indexOf(返回索引)

str.indexOf(searchValue[, fromIndex])

  • searchValue 一個(gè)字符串表示被查找的值

  • fromIndex 可選。

    • fromIndex < 0 則查找整個(gè)字符串(如同傳進(jìn)了 0)
    • 如果 fromIndex >= str.length,則該方法返回 -1
    • 如果被查找的字符串是一個(gè)空字符串,此時(shí)返回 str.length
  • 找到第一個(gè)元素的位置,沒(méi)找到返回-1

    "Hello apple".indexOf("Hello");    // return  0
    "Hello apple".indexOf("Heloo");    // return -1
    "Hello apple".indexOf("apple", 0); // return  6
    "Hello apple".indexOf("apple", 6); // return  6
    "Hello apple".indexOf("", 10);     // return  10
    "Hello apple".indexOf("", 11);     // return  10
    
    //區(qū)分大小寫(xiě)
    "Hello apple".indexOf("hello") // returns -1
    
    //檢測(cè)是否存在某字符串
    "Hello apple".indexOf("hello") !== -1; // true
    "Hello apple".indexOf("heloo") !== -1; // false
    
  • 使用indexOf統(tǒng)計(jì)一個(gè)字符串中某個(gè)字母出現(xiàn)的次數(shù)

    var str = 'To be, or not to be, that is the question.';
    //計(jì)數(shù)
    var count = 0;
    //判斷str中有沒(méi)有e元素
    var pos = str.indexOf('e');
    //如果有e元素,循環(huán)
    while (pos !== -1) {
      //計(jì)數(shù)加一
      count++;
      //從索引加1的位置開(kāi)始找e
      pos = str.indexOf('e', pos + 1);
    }
    console.log(count); // displays 4
    

lastIndexOf(返回索引)

str.lastIndexOf(searchValue[, fromIndex])

  • searchValue 表示被查找的值

  • fromIndex 從后面找。

    • 默認(rèn)值為 str.length。如果為負(fù)值,則被看作 0。如果 fromIndex > str.length,則fromIndex被看作str.length
  • 返回值沒(méi)找到為-1,找到的索引是從前往后的

    "canal".lastIndexOf("a")   // returns 3
    "canal".lastIndexOf("a",2) // returns 1
    "canal".lastIndexOf("a",0) // returns -1
    "canal".lastIndexOf("x")   // returns -1
    

截取字符串

slice(索引)

str.slice(beginSlice[, endSlice])

  • beginSlice 開(kāi)始的字符索引,如果是復(fù)數(shù),就strLength + beginSlice

  • endSlice 結(jié)束的字符索引??蛇x,如果省略直接到末尾,如果是負(fù)數(shù)就是strLength + endSlice

  • 提取字符串,返回字符串,包括beginSlice,不包括endSlice

  • 使用slice()創(chuàng)建一個(gè)新的字符串

    var str1 = 'The morning is upon us.';
    //從第五個(gè)開(kāi)始到不連倒數(shù)第二個(gè)結(jié)束
    var str2 = str1.slice(4, -2);  // returns 'morning is upon u'
    var str2 = str.slice(-3);     // returns 'us.'
    var str2 = str.slice(-3, -1); // returns 'us'
    var str2 = str.slice(0, -1);  // returns 'The morning is upon us'
    console.log(str2); // OUTPUT: morning is upon u
    

substring(索引)

str.substring(indexStart[, indexEnd])

  • indexStart 開(kāi)始索引,0 ~ str.length

  • indexEnd 結(jié)束索引,可選。 0 ~ str.length,省略則到字符串結(jié)束

  • 兩個(gè)參數(shù)小于0或者為NaN,被當(dāng)作0,大于length,則當(dāng)作length。如果開(kāi)始大于結(jié)束,則結(jié)果和參數(shù)調(diào)換一樣

    str.substring(1, 0) == str.substring(0, 1)

  • 截取開(kāi)始到結(jié)束的字符串,返回新數(shù)組

    var anyString = "Mozilla";
    
    // 輸出 "Moz"
    console.log(anyString.substring(0,3));
    console.log(anyString.substring(3,0));
    console.log(anyString.substring(3,-3));
    console.log(anyString.substring(3,NaN));
    console.log(anyString.substring(-2,3));
    console.log(anyString.substring(NaN,3));
    
    // 輸出 "lla"
    console.log(anyString.substring(4,7));
    console.log(anyString.substring(7,4));
    
    // 輸出 ""
    console.log(anyString.substring(4,4));
    
    // 輸出 "Mozill"
    console.log(anyString.substring(0,6));
    
    // 輸出 "Mozilla"
    console.log(anyString.substring(0,7));
    console.log(anyString.substring(0,10));
    
  • 替換一個(gè)字符串的子字符串

    //該例結(jié)尾調(diào)用的函數(shù)將 "Brave New World" 變成了 "Brave New Web"
    function replaceString(oldS, newS, fullS) {
    // Replaces oldS with newS in the string fullS
      for (var i = 0; i < fullS.length; i++) {
        if (fullS.substring(i, i + oldS.length) == oldS) {
         fullS = fullS.substring(0, i) + newS + fullS.substring(i + oldS.length, fullS.length);
        }
      }
      return fullS;
    }
    
    replaceString("World", "Web", "Brave New World");
    
    //需要注意的是,如果 oldS 是 newS 的子字符串將會(huì)導(dǎo)致死循環(huán)。例如,嘗試把 "World" 替換成 "OtherWorld"。一個(gè)更好的方法如下:
    function replaceString(oldS, newS,fullS){
      return fullS.split(oldS).join(newS);
    }
    
    //更簡(jiǎn)單的要用replace
    

substr(長(zhǎng)度)

str.substr(start[, length])

  • start 開(kāi)始提取字符的位置。如果為負(fù)值,則被看strLength + start

  • length 可選,提取的字符數(shù)。不寫(xiě)到結(jié)尾

  • 返回新字符串

    var str = "abcdefghij";
    
    console.log("(1,2): "    + str.substr(1,2));   // (1,2): bc
    console.log("(-3,2): "   + str.substr(-3,2));  // (-3,2): hi
    console.log("(-3): "     + str.substr(-3));    // (-3): hij
    console.log("(1): "      + str.substr(1));     // (1): bcdefghij
    console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab
    console.log("(20, 2): "  + str.substr(20,2));  // (20, 2):
    
  • 兼容,Microsoft's JScript 不支持負(fù)的 start 索引

    // only run when the substr function is broken
    if ('ab'.substr(-1) != 'b')
    {
      /**
       *  Get the substring of a string
       *  @param  {integer}  start   where to start the substring
       *  @param  {integer}  length  how many characters to return
       *  @return {string}
       */
      String.prototype.substr = function(substr) {
        return function(start, length) {
          // did we get a negative start, calculate how much it is
          // from the beginning of the string
          if (start < 0) start = this.length + start;
          
          // call the original function
          return substr.call(this, start, length);
        }
      }(String.prototype.substr);
    }
    

轉(zhuǎn)換大小寫(xiě)

toLocaleUpperCase

str.toLocaleUpperCase()

  • 返回小寫(xiě)轉(zhuǎn)大寫(xiě)的字符串

    console.log('alphabet'.toLocaleUpperCase()); // 'ALPHABET'
    

toLocaleLowerCase

str.toLocaleLowerCase()

  • 返回大寫(xiě)轉(zhuǎn)小寫(xiě)的字符串

    console.log('ALPHABET'.toLocaleLowerCase()); 
    // 'alphabet'
    
    console.log('中文簡(jiǎn)體 zh-CN || zh-Hans'.toLocaleLowerCase());
    // '中文簡(jiǎn)體 zh-cn || zh-hans'
    

替換字符串

replace(生產(chǎn)環(huán)境不建議)

str.replace(regexp|substr,newSubStr|function)

  • regexp 正則對(duì)象或者其字面量,在進(jìn)行全局替換時(shí),要有g(shù)標(biāo)志

  • substr 被替換的字符串

  • newSubStr 替換的新字符串(可以插入特殊字符串)

    | 變量名 | 代表的值 |
    | $$ | 插入一個(gè)"$" |
    | $& | 插入匹配的子串 |
    | $` | 插入當(dāng)前匹配的子串左邊的內(nèi)容 |
    | $' | 插入當(dāng)前匹配的子串右邊的內(nèi)容 |
    | $n | 假如第一個(gè)參數(shù)的正則對(duì)象,n是一個(gè)小于100的非負(fù)整數(shù),那么插入第n個(gè)括號(hào)匹配的字符串 |

  • function 創(chuàng)建新字符串的函數(shù),函數(shù)返回值是替換的內(nèi)容,但是特殊替換的參數(shù)不能使用

  • 返回值是被替換過(guò)的新的字符串,不改變本身

    //下面的例子將會(huì)使 newString 'abc12345#$*%' 變成'abc - 12345 - #$*%'
    function replacer(match, p1, p2, p3, offset, string) {
      // p1 is nondigits, p2 digits, and p3 non-alphanumerics
      return [p1, p2, p3].join(' - ');
    }
    var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
    
  • 使用正則表達(dá)式

    //replace() 中使用了正則表達(dá)式及忽略大小寫(xiě)標(biāo)示。
    var str = 'Twas the night before Xmas...';
    var newstr = str.replace(/xmas/i, 'Christmas');
    console.log(newstr);  // Twas the night before Christmas...
    
  • 使用global和ignore選項(xiàng)

    //下面的例子中,正則表達(dá)式包含有全局替換(g)和忽略大小寫(xiě)(i)的選項(xiàng),這使得replace方法用'oranges'替換掉了所有出現(xiàn)的"apples".
    var re = /apples/gi;
    var str = "Apples are round, and apples are juicy.";
    var newstr = str.replace(re, "oranges");
    console.log(newstr);
    // oranges are round, and oranges are juicy.
    
  • 交換字符串中的兩個(gè)單詞

    //下面的例子演示了如何交換一個(gè)字符串中兩個(gè)單詞的位置,這個(gè)腳本使用$1 和 $2 代替替換文本
    var re = /(\w+)\s(\w+)/;
    var str = "John Smith";
    var newstr = str.replace(re, "$2, $1");
    // Smith, John
    console.log(newstr);
    
  • 使用行內(nèi)函數(shù)來(lái)修改匹配到的字符

    //所有出現(xiàn)的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě),并且在匹配位置前加一個(gè)連字符。重要的是,在返回一個(gè)替換了的字符串前需要在匹配元素前需要進(jìn)行添加操作。
    
    //在返回前,替換函數(shù)允許匹配片段作為參數(shù),并且將它和連字符進(jìn)行連接作為新的片段。
    function styleFormat(name) {
      function lower(match) {
        return '-' + match.toLowerCase();
      }
      return name.replace(/[A-Z]/g, lower);
    }
    styleFormat('borderTop');  //返回 'border-top'
    //因?yàn)槲覀兿朐谧罱K的替換中進(jìn)一步轉(zhuǎn)變匹配結(jié)果,所以我們必須使用一個(gè)函數(shù)。這迫使我們?cè)谑褂胻oLowerCase()方法前進(jìn)行評(píng)估。如果我們嘗試不用一個(gè)函數(shù)進(jìn)行匹配,那么使用toLowerCase() 方法將不會(huì)有效。
    
      var newString = propertyName.replace(/[A-Z]/g, '-' + '$&'.toLowerCase());  //報(bào)錯(cuò)
    
      //這是因?yàn)?$&.toLowerCase() 會(huì)先被解析成字符串字面量(這會(huì)導(dǎo)致相同的$&)而不是當(dāng)作一個(gè)模式。
    
    

拼接字符串

concat

str.concat(string2, string3[, ..., stringN])

  • 將一個(gè)或多個(gè)字符串和原字符串合并,并形成一個(gè)新的字符串返回

  • 強(qiáng)烈建議使用賦值操作符(+,+=)代替concat方法

      var hello = "Hello, ";
      console.log(hello.concat("Kevin", " have a nice day."));
      /* Hello, Kevin have a nice day. */
    
  • 測(cè)試比較 (+ > concat + join) 推薦使用
concat.png

比較字符串

locateCompare

referenceStr.localeCompare(compareString[, locales[, options]])

  • referenceStr 引用字符串

  • compareStr 比較字符串

  • locales指的是比較的語(yǔ)言,options比較標(biāo)準(zhǔn)。這兩個(gè)參數(shù)很多瀏覽器不支持,所以不用

  • 如果引用字符串在比較字符串前面,返回-1,當(dāng)引用字符串在比較字符串后面時(shí)返回1。相同位置返回0(不同瀏覽器的原因,只關(guān)注正反即可)

    //一個(gè)字符一個(gè)字符比較
    'a'.localeCompare('c'); // -2 or -1 (or some other negative value)
    'check'.localeCompare('against'); // 2 or 1 (or some other positive value)
    'a'.localeCompare('a'); // 0
    
  • 檢查瀏覽器對(duì)擴(kuò)展參數(shù)的支持

    //locales 和 options 參數(shù)還沒(méi)有被所有閱覽器所支持。檢查是否被支持, 使用 "i" 參數(shù)判斷是否有異常 RangeError拋出
    function localeCompareSupportsLocales() {
      try {
        'foo'.localeCompare('bar', 'i');
      } catch (e) {
        return e.name === 'RangeError';
      }
      return false;
    }
    

去空格

trim

str.trim()

  • 刪除字符串兩端的空白字符,
  • 返回一個(gè)新字符串

    var orig = '   foo  ';
    console.log(orig.trim()); // 'foo'
    
  • 兼容問(wèn)題,IE8及以下不可用

    if (!String.prototype.trim) {
      String.prototype.trim = function () {
        return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
      };
    }
    

切割字符串

split(數(shù)組)

str.split([separator[, limit]])

  • 將string對(duì)象分割成字符串?dāng)?shù)組,[]表示參數(shù)可選

  • 如果str是空字符串,split返回的是一個(gè)包含空字符串的數(shù)組,而不是一個(gè)空數(shù)組

  • separator 可以是一個(gè)字符串或正則表達(dá)式

    • 如果沒(méi)有separator則返回整個(gè)字符串的數(shù)組形式
    • 如果separator是空字符串,則str將會(huì)把原字符串中每個(gè)字符的數(shù)組形式返回
    • 如果有字符串和表達(dá)式,則匹配字符串,separator會(huì)從字符串中被移除,按照字符串分隔成子串,分別放入數(shù)組
  • limit 一個(gè)整數(shù),限定返回的分割片段的數(shù)量。split方法仍然分割每一個(gè)匹配的separator,但是返回的數(shù)組只會(huì)截取最多l(xiāng)imit個(gè)元素。

    "Webkit Moz O ms Khtml".split( " " )   
    // ["Webkit", "Moz", "O", "ms", "Khtml"]
    
  • 限制返回值中分割元素?cái)?shù)量

    var myString = "Hello World. How are you doing?";
    var splits = myString.split(" ", 3);
    console.log(splits);
    //["Hello", "World.", "How"]    length = 3
    
  • 捕獲括號(hào)

    // separator 包含捕獲括號(hào)(capturing parentheses),則其匹配結(jié)果將會(huì)包含在返回的數(shù)組中
    var myString = "Hello 1 word. Sentence number 2.";
    var splits = myString.split(/(\d)/);
    console.log(splits);
    //[Hello ,1, word. Sentence number ,2,.]
    

?copyright burning.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Javascript有很多數(shù)組的方法,有的人有W3C的API,還可以去MDN上去找,但是我覺(jué)得API上說(shuō)的不全,M...
    頑皮的雪狐七七閱讀 4,203評(píng)論 0 6
  • 字符串對(duì)象的屬性 字符串對(duì)象的方法(說(shuō)明: 底色為土黃色的文字部分主要標(biāo)明改部分的主要特征標(biāo)簽) String對(duì)象...
    南航閱讀 1,115評(píng)論 0 0
  • 1、concat() 鏈接多個(gè)字符串,返回合并后的字符串 ex: var s1=“1”; var s2=“2”; ...
    janey_默閱讀 577評(píng)論 0 0
  • 晚上用步行的方式去【外面】【動(dòng)起來(lái)】,把涌上心頭,擠在心門(mén)的“腦筋涌動(dòng)”帶到“動(dòng)起來(lái)”的狀態(tài)中試圖讓其自行理清脈絡(luò)...
    龐曉低調(diào)想聰明做人閱讀 131評(píng)論 0 0
  • 親愛(ài)的二寶: 晚上好,又過(guò)了兩天才來(lái)碎碎念,你一天天長(zhǎng)大,媽媽一天比一天累了,不能走太快,不能拿太多東西,奶奶說(shuō)可...
    顏若痕閱讀 206評(píng)論 0 1