JavaScript中表示文本的类型是String,即字符串。字符串是16位值的不可修改的有序序列,其中每个值都表示一个Unicode字符。字符串的length属性是它包含的16位值的个数。
JavaScript的 字符串(以及数组)使用基于零的索引,因此第一个16位值的索引是0,第二个值的索引是1,以此类推。空字符串是长度为0的字符串。
JavaScript没有表示单个字符串元素的专门类型。要表示一个16位值,使用长度为1的字符串即可。
JavaScript使用Unicode字符集的UTF-16编码,因此JavaScript 字符串是无符号16位值的序列。最常用的Unicode字符(即“基本多语言平面”中的字符)的码点(codepoint)是16位的,可以用字符 串中的一个元素来表示。码点超出16位的Unicode字符使用UTF-16规 则编码为两个16位值的序列(称为surrogate pair,即“代理对”)。这意味着一个长度为2(两个16位值)的JavaScript字符串 可能表示的只是一个Unicode字符:
JavaScript的字符串操作方法一般操作的是16位值,而不是字符。它们不会特殊对待代理对,不对字符串进行归一化,甚至不保证字符串是格式正确的UTF-16。
在ES6中,字符串是可迭代的,如果对字符串使用for/of循环 或...操作符,迭代的是字符而不是16位值。
1. 字符串字面量
要在JavaScript程序中包含字符串,可以把字符串放到一对匹配的单引号、双引号或者反引号('、"或`)中。由一种引号定义的字符串里也可以包含另外两种引号。
使用反引号定义字符串是ES6的特性,允许在字符串字面量中包含(或插入)JavaScript表达式。
早期:使用+操作符把单行字符串拼接成长字符串。
ES5:在每行末尾加一个反斜杠(\)从而把字符串字面量写到多行上。这个反斜杠和它后面的行终结符都不属于字符串字面量。如果需要在单引号或双引号字符串中包含换行符,需要使用字符序列\n
在使用单引号定义字符串时,必须注意英文中的缩写和所有格,比如can't和O'Reilly中的单引号。因为这里的撇号就是单引号,所以必须使用反斜杠字符(\)“转义”单引号中出现的所有撇号。
最好使用不同的引号,比如双引号里面使用单引号,这样就不会引起冲突。
2.字符串字面量中的转义序列
反斜杠在JavaScript字符串中有特殊的作用:它与后面的字符组合在一起,可以在字符串中表示一个无法直接表示的字符。例 如,\n是一个表示换行符的转义序列。
\'转义之后,它不再表示字符串结束,而是表示撇号。
3.使用字符串
如果对数值使用+操作符,那数值会相加。如果对字符串使用+操作符,那字符串会拼接起来。
可以使用标准的全等===和不全等!==操作符比较字符串。只有当这两个字符串具有完全相同的16位值的序列时才相等。字符串也 可以使用<、<=、>、和>=操作符来比较。
确定字符串长度,可以通过length属性:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let s = "hello nell";
</script>
</body>
</html>
JavaScript中的字符串是不可修改的。方法都返回新字符串,它们并不会修改调用它们的字符串。
字符串也可以被当成只读数组,使用方括号访问字符串中个别的字符:
4.模板字面量
在ES6及之后的版本中,字符串字面量可以用反引号来定义。因为模板字面量可以包含任意JavaScript表达式。
反引号中字符串字面量最终值的计算,涉及对其中包含的所有表达式求值、将这些表达式的值转 换为字符串,然后再把这些字符串与反引号中的字面量组合。
位于${ }之间的内容都被当作JavaScript表达式来解释。而位于这对花括号之外的则是常规字符串字面量。括号内的表达式会被求值,然后转换为字符串并插入模板中,替换美元字符、 花括号以及花括号中的所有内容。
标签化模板字面量
如果在开头的反引 号前面有一个函数名(标签),那么模板字面量中的文本和表达式 的值将作为参数传给这个函数。“标签化模板字面量”(tagged template literal)的值就是这个函数的返回值。这个特性可以用 于先对某些值进行HTML或SQL转义,然后再把它们插入文本。
ES6提供了一个内置的标签函数:String.raw(),函数返回反引号中未经处理的文本,即不会处理任何反斜杠转义。
即使标签化模板字面量的标签部分是函数,在调用这个 函数时也没有圆括号。在这种非常特别的情况下,反引号字符充当 开头和末尾的圆括号。
5.模式匹配
JavaScript定义了一种被称为正则表达式(或RegExp)的数据 类型,用于描述和匹配文本中的字符串模式。RegExp不是 JavaScript中的基础类型,但具有类似数值和字符串的字面量语法,因此它们有时候看起来像是基础类型,常用于文本处理。
一对斜杠之间的文本构成正则表达式字面量。这对斜杠中的第 二个后面也可以跟一个或多个字母,用于修改模式的含义。
RegExp对象定义了一些有用的方法,而字符串也有接收RegExp 参数的方法。