ES6加强了对Unicode的支持,并且扩展了字符串对象。
1、字符的Unicode表示法
JavaScript 允许采用 \uxxxx形式表示一个字符,其中“XXXX”表示字符的码点。但是这种表示法只限于\u0000 --\uFFFF之间的字符。超出这个范围的字符,必须用两个双子节的形式表达。如果直接在\u后面跟上超过0xFFFF的数值,JavaScript会理解成\u 20BB+7.由于\u20bb是一个不可打印字符,所以只会显示一个空格,后面跟着一个7.
ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
如:“\uDB42\uDFB7” //”吉“
"\u{20BB7}" // "吉"
‘\u{1F680}’ ==='\uD83D\uDE80' //true
磁粒子表明,大括号表示法与四字节的UTF-16编码是等价的。
2、codePonitAt()
javaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符,JavaScript会认为她们是两个字符。
ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的码点。
codePointAt方法的参数,是字符在字符串中的位置(从0开始)。
总之,codePontAt方法会正确返回32位的UTF-16字符的码点。对于哪些两个字节存储的常规字符,它的返回结果与charCodeAt方法相同。
codePontAt方法返回的是码点的十进制值。如果想要十六进制的值,可以使用toString方法转换一下。
事实上,codePintAt方法是测试一个字符由两个字节还是四个字节组成的最简单的方法。32Bit
eg:
function is32Bit(c){
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("a") //false
3、String.fromCodePoint()
ES5 提供String.fromCharCode方法,用于从码点返回对应的字符。
ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。
4、字符串的遍历器接口
ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。
eg:
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
5、at()方法。
ES5对字符串对象提供charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符。
ES6提出字符串实例的at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。
6、normalize()
ES6提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。
normalize
方法可以接受一个参数来指定normalize
的方式,参数的四个可选值如下。
NFC
,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。NFD
,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。NFKC
,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize
方法不能识别中文。)NFKD
,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
eg:'abc'.padStart(10, '0123456789')
// '0123456abc'
如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
'xxx'.padEnd(2, 'ab') // 'xxx'
'x'.padEnd(4) // 'x '
'12'.padStart(10, '0') // "0000000012" eg:
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);