本章解释 ECMAScript 6 对 Unicode 的改进支持。有关 Unicode 的一般介绍,请阅读“Speaking JavaScript”中的“Unicode and JavaScript”一章。
ECMAScript 6 在三个方面改进了对 Unicode 的支持
\u{···}
String.prototype.codePointAt()
读取代码点值。String.fromCodePoint()
从代码点值创建字符串。/u
(以及布尔属性 unicode
)改进了对代理对的处理。此外,ES6 基于 Unicode 5.1.0 版本,而 ES5 基于 Unicode 3.0 版本。
在 JavaScript 中,有三种参数化转义序列用于表示字符
\xHH
\uHHHH
\u{···}
Unicode 代码点转义是 ES6 中的新增功能。它们允许您指定超过 16 位的代码点。如果您想在 ECMAScript 5 中这样做,则必须将每个代码点编码为两个 UTF-16 代码单元(一个*代理对*)。这些代码单元可以通过 Unicode 转义来表示。例如,以下语句将火箭(代码点 0x1F680)记录到大多数控制台
使用 Unicode 代码点转义,您可以直接指定大于 16 位的代码点
转义序列可以在以下位置使用
\uHHHH |
\u{···} |
\xHH |
|
---|---|---|---|
标识符 | ✔ | ✔ | |
字符串字面量 | ✔ | ✔ | ✔ |
模板字面量 | ✔ | ✔ | ✔ |
正则表达式字面量 | ✔ | 仅限于标志 /u |
✔ |
标识符
\uHHHH
变为单个代码点。\u{···}
变为单个代码点。字符串字面量
\xHH
贡献一个 UTF-16 代码单元。\uHHHH
贡献一个 UTF-16 代码单元。\u{···}
贡献其代码点的 UTF-16 编码(一个或两个 UTF-16 代码单元)。模板字面量
正则表达式
/u
时才允许使用 Unicode 代码点转义,因为否则 \u{3}
将被解释为三次字符 u
各种信息
该规范区分 BMP 模式(未设置标志 /u
)和 Unicode 模式(设置了标志 /u
)。“模式语义”一节解释了它们的处理方式不同以及如何处理。
提醒一下,以下是规范中如何参数化语法规则
R
具有下标 [U]
,则意味着它有两个版本:R
和 R_U
。[?U]
传递下标。[+U]
,则仅当存在下标 [U]
时,该部分才存在。[~U]
,则仅当不存在下标 [U]
时,该部分才存在。您可以在“模式”一节中看到此参数化的实际应用,其中下标 [U]
为 BMP 模式和 Unicode 模式创建了单独的语法
\u
后面没有四个十六进制数字,则将其解释为 u
)。在 Unicode 模式中,这只适用于以下字符(这释放了 \u
用于 Unicode 代码点转义):^ $ \ . * + ? ( ) [ ] { } |
"\u{" HexDigits "}"
仅在 Unicode 模式中允许使用。在这些模式中,前导代理和后导代理也被分组以帮助进行 UTF-16 解码。“CharacterEscape”一节解释了各种转义序列如何转换为*字符*(粗略地说:代码单元或代码点)。