JavaScript 中的字符串也像 Python 那样支持反斜杠的转移, 并且字符集方面默认为 Unicode, 下面就来详细解析 JavaScript 中的字符串类型与字符编码支持
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
定义
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。
- 'abc'
- "abc"
- 'key = "value"'
- "It's a long journey"
上面两个都是合法的字符串。
如果要在单引号字符串的内部,使用单引号(或者在双引号字符串的内部,使用双引号),就必须在内部的单引号(或者双引号)前面加上反斜杠,用来转义。
- 'Did she say \'Hello\'?'
- // "Did she say 'Hello'?"
- "Did she say \"Hello\"?"
- // "Did she say "Hello"?"
由于 html 语言的属性值使用双引号,所以很多项目约定 JavaScript 语言的字符串只使用单引号,本教程就遵守这个约定。当然,只使用双引号也完全可以。重要的是,坚持使用一种风格,不要两种风格混合。
字符串默认只能写在一行内,分成多行将会报错。
- 'a
- b
- c'
- // SyntaxError: Unexpected token ILLEGAL
上面代码将一个字符串分成三行,JavaScript 就会报错。
如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。
- var longString = "Long \
- long \
- long \
- string";
- longString
- // "Long long long string"
上面代码表示,加了反斜杠以后,原来写在一行的字符串,可以分成多行书写。但是,输出的时候还是单行,效果与写在同一行完全一样。注意,反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。
连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
- var longString = 'Long '
- + 'long '
- + 'long '
- + 'string';
如果想输出多行字符串,有一种利用多行注释的变通方法。
- (function() {
- /*
- line 1
- line 2
- line 3
- */
- }).toString().split('\n').slice(1, -1).join('\n')
- // "line 1
- // line 2
- // line 3"
上面的例子中,输出的字符串就是多行。
转义
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
需要用反斜杠转义的特殊字符,主要有下面这些:
上面这些字符前面加上反斜杠,都表示特殊含义。
- console.log('1\n2')
- // 1
- // 2
上面代码中,\n 表示换行,输出的时候就分成了两行。
反斜杠还有三种特殊用法。
(1)\HHH
反斜杠后面紧跟三个八进制数(000 到 377),代表一个字符。HHH 对应该字符的 Unicode 码点,比如 \ 251 表示版权符号。显然,这种方法只能输出 256 种字符。
(2)\xHH
\x 后面紧跟两个十六进制数(00 到 FF),代表一个字符。HH 对应该字符的 Unicode 码点,比如 \ xA9 表示版权符号。这种方法也只能输出 256 种字符。
(3)\uXXXX
\u 后面紧跟四个十六进制数(0000 到 FFFF),代表一个字符。HHHH 对应该字符的 Unicode 码点,比如 \ u00A9 表示版权符号。
下面是这三种字符特殊写法的例子。
- '\251' // "©"
- '\xA9' // "©"
- '\u00A9' // "©"
- '\172' === 'z' // true
- '\x7A' === 'z' // true
- '\u007A' === 'z' // true
如果在非特殊字符前面使用反斜杠,则反斜杠会被省略。
- '\a'
- // "a"
上面代码中,a 是一个正常字符,前面加反斜杠没有特殊含义,反斜杠会被自动省略。
如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前面需要再加一个反斜杠,用来对自身转义。
- "Prev \\ Next"
- // "Prev \ Next"
字符串与数组
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从 0 开始)。
- var s = 'hello';
- s[0] // "h"
- s[1] // "e"
- s[4] // "o"
- // 直接对字符串使用方括号运算符
- 'hello'[1] // "e"
如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回 undefined。
- 'abc'[3] // undefined
- 'abc'[-1] // undefined
- 'abc'['x'] // undefined
但是,字符串与数组的相似性仅此而已。实际上,无法改变字符串之中的单个字符。
- var s = 'hello';
- delete s[0];
- s // "hello"
- s[1] = 'a';
- s // "hello"
- s[5] = '!';
- s // "hello"
上面代码表示,字符串内部的单个字符无法改变和增删,这些操作会默默地失败。
字符串之所以类似于字符数组,实际是由于对字符串进行方括号运算时,字符串会自动转换为一个字符串对象。
length 属性
length 属性返回字符串的长度,该属性也是无法改变的。
- var s = 'hello';
- s.length // 5
- s.length = 3;
- s.length // 5
- s.length = 7;
- s.length // 5
上面代码表示字符串的 length 属性无法改变,但是不会报错。
字符集
JavaScript 使用 Unicode 字符集,也就是说在 JavaScript 内部,所有字符都用 Unicode 表示。
不仅 JavaScript 内部使用 Unicode 储存字符,而且还可以直接在程序中使用 Unicode,所有字符都可以写成 "\uxxxx" 的形式,其中 xxxx 代表该字符的 Unicode 编码。比如,\u00A9 代表版权符号。
- var s = '\u00A9';
- s // "©"
每个字符在 JavaScript 内部都是以 16 位(即 2 个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为 16 位长度,即 2 个字节。
但是,UTF-16 有两种长度:对于 U+0000 到 U+FFFF 之间的字符,长度为 16 位(即 2 个字节);对于 U+10000 到 U+10FFFF 之间的字符,长度为 32 位(即 4 个字节),而且前两个字节在 0xD800 到 0xDBFF 之间,后两个字节在 0xDC00 到 0xDFFF 之间。举例来说,U+1D306 对应的字符为
来源: http://www.phperz.com/article/17/0303/264589.html