说明:本文参考阮一峰的ECMAScript 6 入门
ES5提供的String.fromCharCode()方法,用于从Unicode码点返回对应的字符,但是这个字符不能正确识别码点大于0xFFFF的字符。
String.fromCharCode(0x20BB7)
//"ஷ"
上面代码中,由于码点0x20BB7大于码点0xFFFF,String.fromCharCode()会舍弃最高位2,最后返回的是u+0BB7对应的字符,而不是想要的码点0x20BB7对应的字符。
ES6为String对象,提供了一个raw()方法。该方法返回一个斜杠都被转义(即斜杠前再加一个斜杠)的字符串,常用于模板字符串的处理方法。
String.raw`Hi\n${2+3}!`;
// 返回 "Hi\\n5!"
String.raw`Hi\u000A!`;
// 返回 "Hi\\u000A!"
与String.fromCharCode()方法类似,String.charCodeAt()也不能正确处理Unicode 码点大于0xFFFF的字符。
var s = "?";
s.length // 2
s.charAt(0) // ''
s.charAt(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271
ES6提供了codePointAt()方法,能够正确处理Unicode 码点大于0xFFFF的字符,返回一个字符的码点。
let s = '?a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97
codePointAt()方法的参数,是字符在字符串中的位置(从 0 开始)。上面代码中,JavaScript 将“?a”视为三个字符,codePointAt 方法在第一个字符上,正确地识别了“?”,返回了它的十进制码点 134071(即十六进制的20BB7)。在第二个字符(即“?”的后两个字节)和第三个字符“a”上,codePointAt()方法的结果与charCodeAt()方法相同。
codePointAt()方法返回的是码点的十进制值,如果想要十六进制的值,可以使用toString()方法转换一下。
let s = '?a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"
传统上,JavaScript只有indexOf()方法,可以确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
let s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
这三个方法都支持第二个参数,表示从哪个位置开始搜索。
let s = `Hello world!`
s.startsWith(`world`, 6) //true
s.endsWith(`Hello`, 5) //true
s.includes(`Hello`, 6) //false
上面代码表示,使用第二个参数n时,endsWith()与其他两个方法不同,它是针对前n个字符。而其他两个方法针对从第n个位置开始直到字符串结束。
repeat()方法返回一个新字符串,表示将原字符串重复n次。
`x`.repeat(3) //"xxx"
`hello`.repeat(2) //"hellohello"
`na`.repeat(0) //""
参数如果是小数,会被取整。
`na`.repeat(1.99) //"na"
如果参数时infinity或-1,会报错
`na`.repeat(Infinity) //range error
`na`.repeat(-1) //range error
但是参数如果是0到-1之间的小数,会被取整为0。
`na`.repeat(-0.9) //""
参数为NaN等同于0。
`na`.repeat(NaN) // ""
如果参数为字符串,则先转换为数字。
`na`.repeat("na) //""
`na`.repeat("2) //"nana"