本章解释 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 > '\x7A' === 'z'
true
\uHHHH > '\u007A' === 'z'
true
\u{···} > '\u{7A}' === 'z'
true
Unicode 代码点转义是 ES6 中的新增功能。它们允许您指定超过 16 位的代码点。如果您想在 ECMAScript 5 中这样做,则必须将每个代码点编码为两个 UTF-16 代码单元(一个*代理对*)。这些代码单元可以通过 Unicode 转义来表示。例如,以下语句将火箭(代码点 0x1F680)记录到大多数控制台
console.log('\uD83D\uDE80');
使用 Unicode 代码点转义,您可以直接指定大于 16 位的代码点
console.log('\u{1F680}');
转义序列可以在以下位置使用
\uHHHH |
\u{···} |
\xHH |
|
|---|---|---|---|
| 标识符 | ✔ | ✔ | |
| 字符串字面量 | ✔ | ✔ | ✔ |
| 模板字面量 | ✔ | ✔ | ✔ |
| 正则表达式字面量 | ✔ | 仅限于标志 /u |
✔ |
标识符
\uHHHH 变为单个代码点。\u{···} 变为单个代码点。> const hello = 123;
> hell\u{6F}
123
字符串字面量
\xHH 贡献一个 UTF-16 代码单元。\uHHHH 贡献一个 UTF-16 代码单元。\u{···} 贡献其代码点的 UTF-16 编码(一个或两个 UTF-16 代码单元)。模板字面量
> `hell\u{6F}` // cooked
'hello'
> String.raw`hell\u{6F}` // raw
'hell\\u{6F}'
正则表达式
/u 时才允许使用 Unicode 代码点转义,因为否则 \u{3} 将被解释为三次字符 u > /^\u{3}$/.test('uuu')
true
各种信息
该规范区分 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”一节解释了各种转义序列如何转换为*字符*(粗略地说:代码单元或代码点)。