转义序列类型
单字符转义序列
一些转义序列由反斜杠后跟单个字符组成。
例如,在 alert("Hello\nWorld");
中,转义序列\n
用于在字符串参数中引入换行符,因此单词 Hello
和 World
以连续的行显示。
转义序列 | 字符 | 统一 |
---|---|---|
\b (仅在字符串中,不在正则表达式中) |
退格 | U + 0008 |
\t |
水平标签 | U + 0009 |
\n |
换行 | U + 000A |
\v |
垂直标签 | U + 000B |
\f |
形式饲料 | U + 000C |
\r |
回车 | U + 000D |
另外,序列\0
,当没有跟随 0 到 7 之间的数字时,可用于转义空字符(U + 0000)。
序列\\
,\'
和\"
用于转义反斜杠后面的字符。虽然类似于非转义序列,其中前导反斜杠被简单地忽略(即\?
为 ?
),但根据规范,它们被明确地视为字符串内的单字符转义序列。
十六进制转义序列
代码在 0 到 255 之间的字符可以用转义序列表示,其中\x
后跟 2 位十六进制字符代码。例如,非中断空格字符在基数 16 中具有代码 160 或 A0,因此可以将其写为\xa0
。
var str = "ONE\xa0LINE"; // ONE and LINE with a non-breaking space between them
对于 9 以上的十六进制数字,使用字母 a
到 f
,小写或大写,没有区别。
var regExp1 = /[\x00-xff]/; // matches any character between U+0000 and U+00FF
var regExp2 = /[\x00-xFF]/; // same as above
4 位 Unicode 转义序列
代码在 0 到 65535(2 16 - 1) 之间的字符可以用转义序列表示,其中\u
后面跟着 4 位十六进制字符代码。
例如,Unicode 标准使用数字 8594 或十六进制格式的 2192 定义右箭头字符(“→”)。所以它的转义序列将是\u2192
。
这会产生字符串“A→B”:
var str = "A \u2192 B";
对于 9 以上的十六进制数字,使用字母 a
到 f
,小写或大写,没有区别。短于 4 位的十六进制代码必须用零填充:\u007A
表示小写字母 z
。
Curly 括号 Unicode 转义序列
Version >= 6
ES6 将 Unicode 支持扩展到 0 到 0x10FFFF 的完整代码范围。为了转义代码大于 2 16 - 1 的字符,引入了转义序列的新语法:
\u{???}
花括号中的代码是代码点值的十六进制表示,例如
alert("Look! \u{1f440}"); // Look! 👀
在上面的示例中,代码 1f440
是 Unicode Character Eyes 的字符代码的十六进制表示。
请注意,花括号中的代码可以包含任意数量的十六进制数字,只要该值不超过 0x10FFFF 即可。对于 9 以上的十六进制数字,使用字母 a
到 f
,小写或大写,没有区别。
带花括号的 Unicode 转义序列只能在字符串内部工作,而不能在正则表达式中工作!
八进制转义序列
从 ES5 开始,不推荐使用八进制转义序列,但在正则表达式中仍然支持它们,在非模板字符串中也支持非严格模式。八进制转义序列由一个,两个或三个八进制数字组成,其值介于 0 和 377 8 = 255 之间。
例如,大写字母 E
在基数 8 中具有字符代码 69 或 105.因此它可以用转义序列\105
表示:
/\105scape/.test("Fun with Escape Sequences"); // true
在严格模式下,字符串中不允许使用八进制转义序列,并且会产生语法错误。值得注意的是,与\00
或\000
不同,\0
不被认为是八进制转义序列,因此在严格模式下仍然允许在字符串(甚至模板字符串)内。
控制转义序列
某些转义序列只能在正则表达式文字中识别(不在字符串中)。这些可用于转义代码在 1 到 26 之间的字符(U + 0001-U + 001A)。它们由一个字母 A-Z 组成(情况没有区别),前面是\c
。\c
之后字母的字母位置确定字符代码。
例如,在正则表达式中
`/\cG/`
字母 G
(字母表中的第 7 个字母)表示字符 U + 0007,因此
`/\cG`/.test(String.fromCharCode(7)); // true