JavaScript中的字符串操作


一、概述


      字符串在JavaScript中 几乎无处不在,在你 解决消费者的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,固然还有更多...JavaScript的核心 部分提供了一组属性和 步骤用于通用的字符串操作,如分割字符串,转变字符串的大小写,操作子字符串等 。


      目前的大 部分阅读器也能从 壮大的正则 抒发式获益,由于它极大地简化了大量的字符串操作 使命,不过它也需求你克服一条有些 笔陡的学习曲线 。在这里,重要是介绍字符串 本身的一些操作,正则 抒发式会在以后的随笔中 波及 。

 

二、字符串的 缔造


      缔造一个字符串有几种 步骤 。最 方便的是用引号将一组字符包括起来, 可以将其赋值给一个字符串变量 。


      var myStr = "Hello, String!";


      可以用双引号或单引号将字符串包括,但要 留神,作为界定字符串的一对引号必须是 雷同的,不能混用 。


      像var myString = "Fluffy is a pretty cat.'; 这样的申明便是非法的 。


      同意 使用两种引号,使得某些操作变得 方便, 比方将一种嵌入另外一种:
      document.write("<img src='img/logo.jpg' height='30' width='100' alt='Logo'>");

 

      我们在上面脚本 缔造了几个字符串,但 性质上,它们并不是真正的字符串对象,精确地说,它们是字符串类型的值 。要 缔造一个字符串对象,可 使用如下语句:var strObj = new String("Hello, String!");


      使用typeof运算符查看会发现,上面的myStr类型为string,而strObj类型为object 。
    
      假如想晓得字符串的长度, 使用其length属性:string.length 。


      得到字符串的指定位置的字符 使用 步骤:string.charAt(index);

 

三、字符串的拼接


问题:


      将两个或多个字符串拼接为一个大的字符串


解决 方案:


      十分 方便,就用一个"+"将两个字符串"相加":


      var longString = "One piece " + "plus one more piece."; 


      要将多个字符串累积为一个字符串,还 可以 使用"+="操作符:


      var result = "";


      result += "My name is Anders"


      result += " and my age is 25";  


    
      要在字符串中增加换行符,需求 使用转义字符"":


      var confirmString = "You did not enter a response to the last " +
        "question.Submit form anyway?";


      var confirmValue = confirm(confirmString);


      但这种 步骤不得不用在像 忠告、确认对话框之类的状况下,假如将这段文本作为HTML内容出现,就无效了,此时            用"<br>" 接替它:


      var htmlString = "First line of string.<br>Second line of string.";


      document.write(htmlString);

 

      String对象还提供了 步骤concat(),它 实现与"+" 雷同的 性能:


      string.concat(value1, value2, ...)


      不过concat() 步骤显然不如"+"来得直观简洁 。

四、 拜访字符串的子串


问题:


    获得一字符串的一 部分的副本 。


解决 方案:


      使用substring()或slice() 步骤(NN4+, IE4+),下面 注明它们的具体用法 。


      substring()的原型为:  string.substring(from, to)


      第一个参数from指定了子字符串在原字符串中的起始位置(基于0的索引);第二个参数to是可选的,它指定了子字符串在原字符串的 完毕位置(基于0的索引),普通状况下,它应比from大,假如它被省略,那么子字符串将向来到原字符串的结尾处 。


      假如参数from不小心比参数to大了会 怎么?JavaScript会自动调解子字符串的起止位置,也便是说,substring()总是从两个参数中较小的那个开始,到较大的那个 完毕 。不过要 留神,它包括起始位置的那个字符,但不包括 完毕位置的那个字符 。


      var fullString = "Every dog has his day.";


      var section = fullString.substring(0, 4); // section is "Ever".


      section = fullString.substring(4, 0);     // section is also "Ever".


      section = fullString.substring(1, 1);     // section is an empty string.


      section = fullString.substring(-2, 4); // section is "Ever", same as fullString.substring(0, 4);    slice()的原型为:  string.slice(start, end)


      参数start 示意子串的起始位置,假如为负数,那么 可以 了解为倒数第几个开始,例如-3 示意从倒数第三个开始;参数end 示意 完毕位置,与start一样,它也 可 认为负数,其 含意也 示意到倒数第几个 完毕 。slice()的参数 可 认为负数,所以要比substring()更加灵便,但没那么宽容了,假如start比end要大,它将返回一个空字符串(示例略) 。


      还有一个 步骤是substr(),其原型为: string.substr(start, length)


      从原型 可以看出它的参数的 含意,start 示意起始位置,length则 示意子字符串的长度 。JavaScript 标准不提倡 使用该 步骤 。


五、字符串的大小写转换


问题:


      在你的页面上有文本框 接纳消费者的输入信息, 比方城市, 而后你会依据他的城市的不同做不同的 解决,这时自然会用到字符串 比较,那么在 比较前,最好进行大小写转换,这样 惟独考量转换后的 情景即可;或者要在页面上收集数据, 而后将这些数据存储在数据库,而数据库恰好只 接纳大写字符;在这些状况下,我们都要考量对字符串进行大小写转换 。


解决 方案:


      使用toLowerCase()和toUpperCase() 步骤:


      var city = "ShanGHai"; 


      city = city.toLowerCase();  // city is "shanghai" now.


六、推断两个字符串是不是相等


问题:


    比方,你想拿消费者的输入值与已知的字符串 比较


解决 方案:


      先将消费者的输入值所有转换为大写(或小写), 而后再行 比较:


      var name = document.form1.txtUserName.value.toLowerCase();


      if(name == "urname")


      {


          // statements go here.


      }


      JavaScript有两种相等运算符 。一种是 彻底向后兼容的, 标准的"==",假如两个操作数类型不 统一,它会在某些时候自动对操作数进行类型转换,考量下面的赋值语句:


      var strA = "i love you!";


      var strB = new String("i love you!");


      这两个变量含有 雷同的字符序列,但数据类型却不同,前者为string,后者为object,在 使用"=="操作符时,JavaScript会尝试各种求值,以检测两者是不是会在某种状况下相等 。所以下面的 抒发式 后果为true: strA == strB 。


      第二种操作符是"严格"的"===",它在求值时不会这么宽容,不会进行类型转换 。所以 抒发式strA === strB的值为false, 固然两个变量持有的值 雷同 。


      有时代码的逻辑要求你推断两个值是不是不相等,这里也有两个 取舍:"!="和严格的"!==",它们的关系就 类似于"=="和"===" 。


探讨:


      "=="和"!="在求值时会尽可能地寻觅值的匹配性,但你可能还是想在 比较前进行显式的类型转换,以"协助"它们 实现工作 。 比方,假如想推断一个消费者的输入值(字符串)是不是等于一个数字,你 可以让"=="帮你 实现类型转换:


      if(document.form1.txtAge.value == someNumericVar) { ... }


      也 可以提前转换:


      if(parseInt(document.form1.txtAge.value) == someNumericVar) { ... }


      假如你 比较习惯于强类型的编程语言( 比方C#,Java等),那么这里你 可以连续你的习惯(类型转换),这样也会 加强程序的可读性 。

 

      有一种状况需求 留神,便是计算机的区域设置 。假如用"<"和">"来 比较字符串,那么JavaScript把它们作为Unicode来 比较,但显然,人们在阅读网页时不会把文本当作Unicode来阅读:) 比方在西班牙语中,依照传统的排序,"ch"将作为一个字符排在"c"和"d"中间 。localeCompare()提供了一种 模式, 可以协助你 使用默许区域设置下的字符排序 规定 。


    var strings;  // 要排序的字符串数组, 假如已经得到初始化


    strings.sort(function(a,b) { return a.localeCompare(b) });  // 调用sort() 步骤进行排序

 

七、字符串的搜索


问题:


    推断一个字符串是不是包括另一个字符串 。


解决 方案:


      使用string的indexOf() 步骤:


      strObj.indexOf(subString[, startIndex])


      strObj为要进行推断的字符串,subString为要在strObj搜索的子字符串,startIndex是可选的, 示意搜索的开始位置(基于0的索引),假如startIndex省略,则从strObj开始处搜索,假如startIndex小于0,则从0开始,假如startIndex大于最大索引,则从最大索引处开始 。


      indexOf()返回strObj中subString的开始位置,假如没有找到,则返回-1 。在脚本中, 可以这么 使用:


      if(largeString.indexOf(shortString) != -1)


      {


          // 假如包括,进行相应 解决;


      }


      兴许一个字符串会包括另一字符串不止一次,这时第二个参数startIndex 兴许会派上用场,下面这个函数演示如何求得一个字符串包括另外一个字符串的次数:


      function countInstances(mainStr, subStr)
      {
         var count = 0;
         var offset = 0;
         do
        {
            offset = mainStr.indexOf(subStr, offset);
            if(offset != -1)
           {
                count++;
                offset += subStr.length;
            }
        }while(offset != -1)
        return count;
      }


      String对象有一个与indexOf()对应的 步骤,lastIndexOf():


      strObj.lastIndexOf(substring[, startindex])


      strObj为要进行推断的字符串,subString为要在strObj搜索的子字符串,startIndex是可选的, 示意搜索的开始位置(基于0的索引),假如startIndex省略,则从strObj末尾处搜索,假如startIndex小于0,则从0开始,假如startIndex大于最大索引,则从最大索引处开始 。该 步骤自右向左搜索,返回subString在strObj中最终出现的位置,假如没有找到,返回-1 。

 

八、在Unicode值和字符串中的字符间转换


问题:


    获得一个字符的Unicode编码值,反之亦然 。


解决 方案:


      要 获得字符的Unicode编码, 可以 使用string.charCodeAt(index) 步骤,其定义为:


      strObj.charCodeAt(index)


      index为指定字符在strObj对象中的位置(基于0的索引),返回值为0与65535中间的16位整数 。例如:


      var strObj = "ABCDEFG";


      var code = strObj.charCodeAt(2); // Unicode value of character 'C' is 67


      假如index指定的索引处没有字符,则返回值为NaN 。

 

      要将Unicode编码转换为一个字符, 使用String.fromCharCode() 步骤, 留神它是String对象的一个"静态 步骤",也便是说在 使用前不需求 缔造字符串实例:


      String.fromCharCode(c1, c2, ...)


      它 承受0个或多个整数,返回一个字符串,该字符串包括了各参数指定的字符,例如:


      var str = String.fromCharCode(72, 101, 108, 108, 111);  // str == "Hello"


探讨:


      Unicode包括了这个世界上众多书写语言的字符集,但别由于Unicode包括一个字符就 期冀这个字符 可以在 忠告对话框、文本框或页面出现时 畸形显示 。假如字符集不可用,在页面将显示为问号或其它符号 。一台典型的北美的计算机将不能在屏幕上显示中文字符,除非中文的字符集及其字体已经安装 。