码迷,mamicode.com
首页 > 其他好文 > 详细

字符串的扩展

时间:2019-12-25 13:26:38      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:http   改进   汉字   bsp   strong   报错   proposal   ring   字符   

1.字符的 Unicode 表示法 

ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。

"\u0061"
// "a"

但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。

"\uD842\uDFB7"
// "??"

"\u20BB7"
// " 7"

上面代码表示,如果直接在\u后面跟上超过0xFFFF的数值(比如\u20BB7),

JavaScript 会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7

 

ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。

技术图片

 

 

上面代码中,最后一个例子表明,大括号表示法与四字节的 UTF-16 编码是等价的。

有了这种表示法之后,JavaScript 共有 6 种方法可以表示一个字符。

技术图片

 

 

2.字符串的遍历器接口 

ES6 为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。

技术图片

 

 除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF码点,传统的for循环无法识别这样的码点。

技术图片

 

 

上面代码中,字符串text只有一个字符,但是for循环会认为它包含两个字符(都不可打印),而for...of循环会正确识别出这一个字符。

3.直接输入 U+2028 和 U+2029 

JavaScript 字符串允许直接输入字符,以及输入字符的转义形式。举例来说,“中”的 Unicode 码点是 U+4e2d,你可以直接在字符串里面输入这个汉字,也可以输入它的转义形式\u4e2d,两者是等价的。

技术图片

 

 

但是,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),没法修改了。为了消除这个报错,ES2019 允许 JavaScript 字符串直接输入 U+2028(行分隔符)和 U+2029(段分隔符)。

技术图片

 

 

根据这个提案,上面的代码不会报错。

注意,模板字符串现在就允许直接输入这两个字符。

另外,正则表达式依然不允许直接输入这两个字符,这是没有问题的,因为 JSON 本来就不允许直接包含正则表达式。

字符串的扩展

标签:http   改进   汉字   bsp   strong   报错   proposal   ring   字符   

原文地址:https://www.cnblogs.com/Rivend/p/12095784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!