导读:字符串是由JavaScript字符组成的不可变序列。其中每个字符是一个16位的UTF-16编码单元。这意味着一个Unicode字符相当于一个或两个JavaScript字符。无论是计算字符串还是分割字符串,只需关注两个JavaScript字符的情况。这点我们会在后续章节展开。
(1) 字符串字面量
单引号和双引号都可以表示字符串字面量,因此,你可以任意选择单引号或者双引号。不过有以下几点需要注意:
1. 最常见的做法是在HTML中使用双引号,在JavaScript中使用单引号。
2. 最好在多编码环境下使用双引号。
3. 在JSON中,必须使用双引号。
(2) 字符串字面量中的转义字符
1. 避免换行
通过反斜杠对行结束符进行转义,使一个字符能够跨行书写
2. 转义序列
\b是空格符,\f是换页符,\n是换行符,\r是回车符,\t是水平制表符,\v是垂直制表符
\'是单引号,\"是双引号,\\是反斜杠
3.NUL字符
该字符由\0表示
4. 十六进制转义序列
5. Unicode转义序列
例如\uHHHH(HHHH是4个十六进制数字)表示一个UTF-16编码单元
(3) 字符访问
有两种方式:
'abc'.charAt(1); // b
'abc'[1]; // b
不过第二种方式,在某些低版本浏览器中不支持。
(4) 手动转换字符串
1. String(value)
2. '' + value
3. value.toString()
(5) 字符串拼接
1. 合并: 加号(+)运算符
如果你想将字符串集中在一个变量中,你可以使用 += 运算符:
var str = '';
str += 'Hello ';
str += 'World';
console.log(str); // Hello World
2. 合并: 拼接字符串
可以将所有的字符串添加进一个数组中,然后调用join方法拼接起来:
var str = [];
str.push('Hello');
str.push('World');
str.join(' ');
console.log ( str ); // ["Hello", "World"]
我:这里和书上不一样,所以我个人建议还是不要用这种方法了。
(6) 字符串函数
与Numer一样,有两种方式:
1. String(value)
2. new String
比较常用的是第一种。
(7) 字符串构造器方法
String.fromCharCode()返回一个由UTF-16编码单元组成的字符串,其中每一UTF-16编码对应一个无符号整数。例如:
console.log ( String.fromCharCode(97,98,99) ); // abc
注:String.fromCharCode()是String.CharCodeAt()的逆操作。
(8) length属性
length属性表示JavaScript字符串字符的个数,且它是不可枚举的。
(9) 字符串原型方法
1. 提取字字符串
① String.prototype.charAt(pos)
该方法返回给定位置的pos的字符
'abc'.charAt(1); // b
② String.prototype.charCodeAt(pos)
该方法返回给定位置pos的JavaScript字符(UTF-16编码单元)对应的无符号整数。
③ String.prototype.slice(start,end?)
该方法返回一个子字符串,它包括原字符串从start开始到end结束的所有字符(包括start,不包括end)。两个参数都可以为负数,此时会将参数与字符串的length属性相加:
'abc'.slice(2); // c
'abc'.slice(1,2); // b
'abc'.slice(-2); // bc
'abc'.slice(-2,-1); // b
String.prototype.substring(start,end?)方法可以代替slice()。
④ String.prototype.split(separator?,limit?)
该方法通过在separator指定的边界处将原字符串分割成子字符串,返回由子字符串组成的数组。
● separator:可以为字符串或者正则表达式。若未传入,将会把整个字符串封装在数组中返回。
● limit:若传入,则返回的数组最多只能包括limit个元素。
console.log ( 'a,b,c,d'.split(',') ); // ["a", "b", "c", "d"]
2. 字符串的变换
接下来的方法是介绍如何将一个给定字符串变换为一个新字符串。换句话说,原始字符串会在变换后被丢弃。
① String.prototype.trim()
该方法去除字符串开头和结尾的空格。
② String.prototype.concat()
该方法返回由拼接的字符串与str1、str2等参数拼接形成的新字符串。
console.log ( 'hello'.concat(' ' , 'World' , '!' ) ); // hello World!
③ String.prototype.toLowerCase()
该方法将原字符串中的字符转换成小写并返回。
console.log ( 'hELLO WoLrD'.toLowerCase() ); // hello World
String.prototype.toLocalLowerCase()的功能与String.prototype.toLowerCase()一样,但是转换时其遵循本地规则。
④ String.prototype.toUpperCase()
该方法将原字符串中的字符转换成大写并返回。
console.log ( 'hELLO WoLrD'.toUpperCase() ); // HELLO WORLD
String.prototype.toLocalUpperCase()的功能与String.prototype.toUpperCase()一样,但是转换时其遵循本地规则。
3. 字符串的检索和比较
① String.prototype.indexOf(searchString,position?)
该方法从字符串的position位置(默认为0)开始检索,返回searchString在字符串中出现的位置,若未找到则返回-1。
② String.prototype.lastIndexOf(searchString,position?)
该方法从字符串的position位置(默认为结尾位置)开始从后向前检索,返回searchString在字符串中出现的位置,若未找到则返回-1。
③ String.prototype.localCompare(other)
该方法用本地特定的顺序对字符串和other进行比较。其返回的是数字:
● 字符串在字母表中排在other前面时则返回值小于0;
● 字符串等于other时返回值等于0;
● 字符串在字母表中排在other后面时则返回值大于0。
4. 支持正则表达式的方法
① String.prototype.search(regexp)
该方法返回字符串中第一个与regexp相匹配的字符串的起始位置(若未匹配则返回-1)。
console.log ( '-yy-xxx-y'.search(/x+/) ); // 4
② String.prototype.match(regexp)
该方法将regexp与字符串进行匹配。若regexp未设置全局标志/g则返回一个对象,它存放了第一次匹配相关的信息;若设置的/g,那么将所有匹配的字符串存放在一个数组中返回。
③ String.prototype.replace(search,replacement)
该方法检索与search匹配的字符串并用replacement替换。search可以是字符串或正则表达式,replacement可以是字符串或者函数。除非search是设置了/g标志的正则表达式,否则仅第一个匹配项会被替换。