JavaScript中的字符串操作详解


Posted in Javascript onNovember 12, 2013

一、概述
    字符串在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";  

    要在字符串中添加换行符,需要使用转义字符"\n":
var confirmString = "You did not enter a response to the last " +
        "question.\n\nSubmit 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包含一个字符就期望这个字符能够在警告对话框、文本框或页面呈现时正常显示。如果字符集不 可用,在页面将显示为问号或其它符号。一台典型的北美的计算机将不能在屏幕上显示中文字符,除非中文的字符集及其字体已经安装。

参考:
    JavaScript And Dhtml Cookbook(Oreilly)      ;
    JavaScript-The Definitive Guide(4th Edition);

Javascript 相关文章推荐
javascript 动态加载 css 方法总结
Jul 11 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
Apr 27 Javascript
jQuery的deferred对象使用详解
Aug 20 Javascript
页面右下角弹出提示框示例代码js版
Aug 02 Javascript
js的隐含参数(arguments,callee,caller)使用方法
Jan 28 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
jQuery插件formValidator实现表单验证
May 23 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
Paypal支付不完全指北
Jun 04 Javascript
Js跳出两级循环方法代码实例
Sep 22 Javascript
JavaScript简单实现网页回到顶部功能
Nov 12 #Javascript
判定是否原生方法的JS代码
Nov 12 #Javascript
给文字加上着重号的JS代码
Nov 12 #Javascript
深入理解javascript动态插入技术
Nov 12 #Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 #Javascript
JS常用正则表达式总结
Nov 12 #Javascript
jquery 删除cookie失效的解决方法
Nov 12 #Javascript
You might like
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python实现批量下载文件
2015/05/17 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python如何调用外部系统命令
2019/08/07 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
文秘专业个人求职信
2013/12/22 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
800字作文之大雪
2019/12/04 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL