7.1 定义字符串
定义字符串有多种方式,如字符串直接量、构造字符串和使用字符编码设计字符串,下面分别进行介绍。
7.1.1 字符串直接量
定义字符串直接量的方法很简单,使用双引号或单引号包含字符文本即可。例如:
var s="abc"; //定义字符串直接量 var s="字符串直接量"; //定义字符串直接量
【示例1】任何字符被引号包含,都会被转换为字符串类型数据。
var s="true"; //把布尔值转换为字符串直接量 var s="123"; //把数值转换为字符串直接量 var s="[1,2,3]"; //把数组转换为字符串直接量 var s="{x:1, y:2}"; //把对象转换为字符串直接量 var s="alert('Hello, World')"; //把可执行表达式转换为字符串直接量
由于一些字符包含双重或多重语义,把它们包含在字符串中,会破坏字符串的值,甚至破坏字符串的类型,因此需要转义特殊字符,避免产生歧义。
【示例2】单引号和双引号配合使用,以应对特殊形式的字符串需要。
var s = "alert('Hello, World')";
可以这样写:
var s = 'alert("Hello, World")';
单引号可以包含双引号,或者双引号包含单引号。但是不能够在单引号中包含单引号,或者在双引号中包含双引号。下面写法都是错误的:
var s='alert('Hello, World')'; //非法的字符串 var s="alert("Hello, World")"; //非法的字符串
【示例3】如果要表示引号字符,需要使用转义序列来表示。
var s="""; //非法引号字符串 var s="\""; //有效的引号字符串
【示例4】对于字符串类型的语句或表达式,可以调用静态方法eval()来执行。
var s="alert('Hello, World')"; //表达式字符串 eval(s); //执行表达式字符串
7.1.2 构造字符串
String是JavaScript内置对象,调用String()构造函数可以构造字符串,该函数可以接收一个参数,并把它作为初始值来初始化字符串。
【示例1】下面的代码使用了new运算符调用String()构造函数,将创建一个字符串型对象。
var s=new String(); //创建一个空字符串对象,并赋值给变量s var s=new String("我是构造字符串"); //创建字符串对象,初始化之后赋值给变量s
注意:通过String构造函数构造的字符串与字符串直接量的类型是不同的。前者为引用型对象,后者为值类型的字符串。
【示例2】下面的代码比较了构造字符串和字符串直接量的数据类型的不同。
var s1=new String(1); //构造字符串 var s2="1"; //定义字符串直接量 alert(typeof s1); //返回object,说明是引用型对象 alert(typeof s2); //返回string,说明是值类型字符串
从上面示例可以看到,String构造函数实际上是字符串的包装类,利用它可以把值类型字符串包装为引用型对象,以适应各种字符串的特殊处理。
【示例3】String()也可以作为普通函数使用,把参数转换为字符串类型的值返回,此时它就不是构造函数了。
var s=String(123456); //包装字符串 alert(s); //返回字符串"123456" alert(typeof s); //返回string,说明该方法不再是构造函数
【示例4】String()可以带有多个参数,但是它仅处理第一个参数,并把它转换为字符串返回。
var s=String(1,2,3,4,5,6); //带有多个参数 alert(s); //返回字符串"1" alert(typeof s); //返回string,数值被转换为字符串
String构造函数也可以附带多个参数,它仅负责构造第一个参数,并返回它的字符串。但是,所附带的多个参数是会被JavaScript执行计算的。
【示例5】下面的变量n在构造函数内经过多次计算之后,最后值递增为5。如下:
var n=1; //初始化变量 var s=new String(++n, ++n, ++n, ++n); //字符串构造处理 alert(s); //返回2 alert(n); //返回5 alert(typeof s); //返回object,说明是引用类型对象 alert(typeof n); //返回number,说明是数值类型
7.1.3 使用字符编码
String对象预定义了fromCharCode()方法,该方法能够根据字符编码创建字符串,这对于希望通过数字动态生成字符串来说,是非常有用的。
fromCharCode()方法可以包含多个整数参数,每个参数代表字符的Unicode编码。返回值含有指定编码的字符的新字符串。
【示例】下面的代码演示了如何将一组字符串编码转换为字符串。
var a=[35835,32773,24744,22909], b=[]; //声明一个字符编码的数组 for(var i in a){ //遍历数组 b.push(String.fromCharCode(a[i])); //把每个字符编码都转换为字符串 } alert(b.join("")); //返回字符串"读者您好"
可以把所有字符串按顺序传递给fromCharCode()方法。
var b=String.fromCharCode(35835,32773,24744,22909); //传递多个参数,返回字符串"读者您好"
可以使用Function的apply()方法动态调用数组参数:
var a = [35835, 32773, 24744, 22909], b = []; var b=String.fromCharCode.apply(null, a); //使用apply()方法调用fromCharCode()方法,并传递数组参数 alert(b); //返回字符串"读者您好"
fromCharCode()方法是String对象的静态方法,不能在字符串中直接调用。
提示:fromCharCode()方法可以与String对象的charCodeAt()配合使用,执行相反操作。
charCodeAt()可以把字符串转换为编码,而fromCharCode()方法能够把编码转换为字符串。