1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(proposal): edit proposal

This commit is contained in:
ruanyf 2018-02-01 18:47:58 +08:00
parent 461d3edae8
commit fb5ef8dc33

View File

@ -160,3 +160,33 @@ a?.b = 42
// 如果 a 是 null 或 undefined下面的语句不产生任何效果
delete a?.b
```
## 直接输入 U+2028 和 U+2029
JavaScript 字符串允许直接输入字符,以及输入字符的转义形式。举例来说,“中”的 Unicode 码点是 U+4e2d你可以直接在字符串里面输入这个汉字也可以输入它的转义形式`\u4e2d`,两者是等价的。
```javascript
'中' === '\u4e2d' // true
```
但是JavaScript 规定有5个字符不能在字符串里面直接使用只能使用转义形式。
- U+005C反斜杠reverse solidus)
- U+000D回车carriage return
- U+2028行分隔符line separator
- U+2029段分隔符paragraph separator
- U+000A换行符line feed
举例来说,字符串里面不能直接包含反斜杠,一定要转义写成`\\`或者`\u005c`
这个规定本身没有问题,麻烦在于 JSON 格式允许字符串里面直接使用 U+2028行分隔符和 U+2029段分隔符。这样一来服务器输出的 JSON 被`JSON.parse`解析,就有可能直接报错。
JSON 格式已经冻结RFC 7159没法修改了。为了消除这个报错现在有一个[提案](https://github.com/tc39/proposal-json-superset),允许 JavaScript 字符串直接输入 U+2028行分隔符和 U+2029段分隔符
```javascript
const PS = eval("'\u2029'");
```
根据这个提案,上面的代码不会报错。
注意,模板字符串现在就允许直接输入这两个字符。另外,正则表达式依然不允许直接输入这两个字符,这是没有问题的,因为 JSON 本来就不允许直接包含正则表达式。