字符串拓展
字符串的表示法
论表示一个字符我们可以使用的方法有什么?
'\z' === 'z' //true
'\172' === 'z' //true
' \x7A' === 'z' //true
' \u007A'==='z' //true
' u{7A}'=== 'z' //true
上面描述的方法都是可以用表示字符的。
在ES6中加强了对Unicode的支持,允许采用\uxxxx
形式表示一个字符,其中的xxxx表示字符的Unicode 码点。但是使用这种方式表示一个字符时,码点只限于在\u0000
~\uFFFF
之间。超出这个范围的字符必须用两个双字节的形式表示。
"\uD842\uDFB7"
// "?"
上面的那个字就是一个典型的双字节表示。除了这种方法可以表示码点超出\0xFFFF
的字符,还可以直接将码点中的数值放进大括号里,如:
'\u{1F680}' === '\uD83D\uDE80'
// true
ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
而且上面的例子表明,大括号表示法和四字节的UTF-16编码等价,所以我们一共有6种方法可以表示一个字符。
字符串的遍历器接口
ES6 为字符串添加了遍历器接口,使得字符串可以被for...of
循环遍历。
for (let codePoint of 'foo') {
console.log(codePoint);
}
// "f"
// "o"
// "o"
这个遍历器最大优点就是可以识别大于0xFFFF
的码点,而传统的for循环遍历并不能识别。
let text = String.fromCodePoint(0x20BB7);
for (let i = 0; i < text.length; i++) {
console.log(text[i]);
}
// " "
// " "
for (let i of text) {
console.log(i);
}
// "?"
直接输入字符
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.stringify()的改造
为了防止返回不符合UTF-8标准的编码,JSON.stringify()
做了改造 ——如果遇到0xD800
到0xDFFF
之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。
JSON.stringify('\u{D834}') // ""\\uD834""
JSON.stringify('\uDF06\uD834') // ""\\udf06\\ud834""
模板字符串
传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法)。
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);