Unicode强化
新的表示法
"u0061" === 'a' // 双字节Unicode
"uD842uDFB7" // 之前,大于uFFFF的Unicode必须拆写成两个双字节
"u{20BB7}" // ES6提供了这种表示法,无需拆写
codePointAt()
JS内部,字符采用UTF-16编码保存,每个字符固定两个字节。而之前的API,对于Unicode码点大于0xFFFF的字符,会被认为是两个字符。例如.length会为2,.charAt(0)不能读出整个字符(而只能读出前两个字节)。
对于占位两个双字节的字符,使用.codePointAt(0)会得到一个大于0xFFFF的值,就是该字符的码点,而.codePointAt(1)就无意义了。
String.fromCodePoint()
之前的API的String.fromCharCode当然也无法处理大于0xFFFF的字符(高位被舍去),而String.fromCodePoint可以。
for of支持
for of除了可以顺序遍历字符串外,还支持识别大于0xFFFF的码点。
其他新API
includes(),startsWith(),endsWith()
includes代替了indexOf !== -1。后两个判断是否以该子串开始或结束。
都可指定第二个参数n表示开始搜索的位置(前两个),或范围为前n个字符(endsWith)。
repeat()
'x'.repeat(3) // 'xxx'
'y'.repeat(0) // ''
padStart(), padEnd()
如果字符串不足某个长度,可在头或者尾补上特定子串或子串的一部分直到恰凑满长度。
模板字符串
使用反引号定义。在里面可以用${}嵌入变量或表达式。多行形式下所有空格和换行也会被保留。
模板字符串甚至可以嵌套。
`<p>${addrs.map(addr => `${addr.x} - ${addr.y}`)}</p>`
模板字符串还可以用来传参,这也是jsx``的实现原理。
tag`Hello ${x} world ${y}`
// 相当于
tag(['Hello ', ' world ', ''], x, y)
String.raw()
返回一个每一个反斜线自身都被转义的字符串。