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 相关文章推荐
js一组验证函数
Dec 20 Javascript
JQuery 学习笔记01 JQuery初接触
May 06 Javascript
如何用js控制frame的隐藏或显示的解决办法
Mar 20 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
JS实现的表头列头固定页面功能示例
Jan 10 Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
从零开始学习搭建React脚手架项目
Aug 23 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
Sep 20 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
原生JavaScript实现换肤
Feb 19 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
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
php生成扇形比例图实例
2013/11/06 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
设定php简写功能的方法
2019/11/28 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
日语专业个人的求职信
2013/12/03 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
银行求职信
2014/05/31 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
共青团员自我评价
2015/03/10 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
爱国主题班会教案
2015/08/14 职场文书
小学毕业教师寄语
2019/06/21 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS