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 getElementsByTagName
Jan 31 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
Javascript变量作用域详解
Dec 06 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
Apr 04 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
微信小程序与webview交互实现支付功能
Jun 07 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验证码类实例分享
2013/12/27 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
php post换行的方法
2020/02/03 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
js Math 对象的方法
2013/09/01 Javascript
angularjs基础教程
2014/12/25 Javascript
angularJS 入门基础
2015/02/09 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
Python爬虫设置代理IP(图文)
2018/12/23 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
超市5.1促销活动
2014/01/15 职场文书
学校课外活动总结
2014/05/08 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
党建工作经验交流材料
2014/05/25 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
爱心募捐通知范文
2015/04/27 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python