字符串的扩展

字符的 unicode 表示法

JavaScript 利用\uxxxx(UTF-16) 表示一个字符,xxxx表示 unicode 码点,一个字符包括两个字节,表示范围只能是\u0000~\uFFFF,如果超出\uFFFF的范围, ES5 就利用双字符表示,也就是四个字节,比如 \uD842\uDFB7

ES6 则支持将大于四位的码点放入大括号,可以当成一个字符识别,比如 \u{20BB7}

String.prototype.codePointAt()

因为扩展了字符的 unicode 表示法,所以字符串的charAt()charCodeAt()方法会失真,在对码点大于0xFFFF的字符的时候,这两个方法会把它当作两个字符处理

ES6 新增了codePointAt()方法,来正确识别4个字节储存的字符

let s = '𠮷a';

s.codePointAt(0) // 134071
s.codePointAt(1) // 57271

s.codePointAt(2) // 97

上面代码中,JavaScript 会把𠮷a视为三个字符,codePointAt(0) 正确识别了𠮷的码点,codePointAt(1) 则识别了𠮷字符后面两个字节的码点,codePointAt(2)则识别了a字符的码点

经过测试发现,上面的方法还是不正确的,表面上看在𠮷a中,a 字符在第二个位置,正确的位置序号应该是1,解决办法为使用 for...of循环,它可以正确识别 32 位的 UTF-16 字符

charPointAt(n)返回的是十进制数据,可以通过toString(16)将其转换成 16 进制数据

String.fromCodePoint()

  • ES5 提供的fromCharCode()方法,用于从码点返回字符,但这个方法不能识别 32 位的 UTF-16 字符
  • ES6 新增的String.fromCodePoint()方法则解决了上述问题,与charPointAt()方法的作用正好相反,需要注意的是fromCodePoint()方法定义在String上面,而charPointAt()方法定义在字符串实例上面

字符串的遍历接口

可以使用for...of遍历字符串,并且可以正确识别 32 位的 UTF-16 的字符

at()

替代 ES5 的charAt()方法,增加对 32 位的 UTF-16 的字符的识别

判断一个字符串是否包含在另外一个字符串内

  • indexOfES5
  • includesES6 返回布尔值
  • startsWithES6 返回布尔值
  • endWithES6 返回布尔值

repeat()

返回一个新的字符串,将原字符串重复n次

'x'.repeat(3)  // 'xxx'

padStart(), padEnd()

字符串补齐

'c'.padStart(4, 'ab')  // 'abac'

matchAll()

参见《正则表达式》

字符串模版

反引号,大括号里面可以写任意表达式

let name = 'Tom';
`this is ${name}`;	// 'this is Tom'
上次更新: 10/7/2018, 10:23:42 PM