ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、概述 ### 1.1 定义 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。 ~~~ '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 语言的字符串只使用单引号。当然,只使用双引号也完全可以。重要的是坚持使用一种风格,不要一会使用单引号表示字符串,一会又使用双引号表示。 * 如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。 ~~~ var longString = 'Long \ long \ long \ string'; longString // "Long long long string" ~~~ * 连接运算符(`+`)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。 ~~~ var longString = 'Long ' + 'long ' + 'long ' + 'string'; ~~~ ### 1.2 转义 反斜杠(\\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。 需要用反斜杠转义的特殊字符,主要有下面这些。 * `\0`:null(`\u0000`) * `\b`:后退键(`\u0008`) * `\f`:换页符(`\u000C`) * `\n`:换行符(`\u000A`) * `\r`:回车键(`\u000D`) * `\t`:制表符(`\u0009`) * `\v`:垂直制表符(`\u000B`) * `\'`:单引号(`\u0027`) * `\"`:双引号(`\u0022`) * `\\`:反斜杠(`\u005C`) 上面这些字符前面加上反斜杠,都表示特殊含义。 ~~~ console.log('1\n2') // 1 // 2 ~~~ 上面代码中,`\n`表示换行,输出的时候就分成了两行。 ### 1.3 字符串与数组 字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从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" ~~~ ### 1.4 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 会自动识别一个字符是字面形式表示,还是 Unicode 形式表示。输出给用户的时候,所有字符都会转成字面形式。 ~~~ var f\u006F\u006F = 'abc'; foo // "abc" ~~~ 上面代码中,第一行的变量名`foo`是 Unicode 形式表示,第二行是字面形式表示。JavaScript 会自动识别。 我们还需要知道,每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节。 JavaScript 对 UTF-16 的支持是不完整的,由于历史原因,只支持两字节的字符,不支持四字节的字符。这是因为 JavaScript 第一版发布的时候,Unicode 的码点只编到`U+FFFF`,因此两字节足够表示了。后来,Unicode 纳入的字符越来越多,出现了四字节的编码。但是,JavaScript 的标准此时已经定型了,统一将字符长度限制在两字节,导致无法识别四字节的字符。