字符串的拓展
字符的Unicode表示法
ES5中,Unicode必须是\uxxxx形式的,少与4位不行,多于四位必须拆成两个4位的来表示。在ES6中,将一个码点值放在大括号中可以自动解析。与双字节表示等价。
console.log("\uD842\uDFB7");// "��"
console.log("\u20BB7");//乱码
console.log("\u{20BB7}");//正常解析
console.log("\u41");//报错
console.log("\u{41}");//A
console.log('\u{1F680}' === '\uD83D\uDE80');//true
codePointAt()
在JS内部,字符以UTF-16的格式储存,每个字符固定为两个字节,对于那些需要4个字节来储存的字符,JS认为他们是两个字符。此时charAt方法和charCodeAt方法都无法完整获取这样的字符的码点值。
codePointAt可以
var s = '��b';
console.log(s.codePointAt(0).toString(16)); // 20bb7
console.log(s.codePointAt(2).toString(16)); // 62
可以看到,这个方法正确的获取了码点,双字节和四字节的都可以。
不过注意到b应该是第2个字而我们传进了2。因为这个方法并不能判断这个字符前面的所有字符是双字节还是四字节的,所以只能按照双字节的下标来。
这个问题是可以解决的。使用for…of循环,它可以正确识别4字节字符。
var s = '��a';
for (let ch of s) {
console.log(ch.codePointAt(0).toString(16));
}
String.fromCodePoint()
String.fromCharCode的支持四字节版
String.fromCodePoint(0x20BB7)
字符串遍历器接口
刚才已经提到了,使用for…of可以正确识别4字节字符为一个字符。
at()
这个是charAt的四字节版,目前貌似大多数都没实现。
'��'.at(0) // "��"
normalize()
标准化Unicode
比如带音标的字母,可以2字节表示也可以4字节表示,这个方法标准化它
'\u01D1'.normalize() === '\u004F\u030C'.normalize()
includes(), startsWith(), endsWith()
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
repeat
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
padStart(),padEnd()
ES7中推出了字符补全长度的功能,如果某个字符串不够指定长度,就会在头部或尾部补全。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
位数超了会截掉用来补全的字符串
'abc'.padStart(