ES6字符串的扩展

157 阅读2分钟

字符串的Unicode表示法

ES6加强了对Unicode的支持,并且扩展了字符串对象

Unicode表

Javascript允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。

''\u0061"
//a

但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用2个双字节的形式表示。

console.log('\uD842\uDFB7')   //𠮷

console.log('\u20BB7')        //₻7

上面的代码表示,如果直接在\u后面跟上超过0xFFFF的数值(比如20BB7),JavaScript会理解成\u20BB + 7。ES6对这一点进行了改进,只要将码点放入大括号,就能正确解读该字符。

console.log('\u{20BB7}')      //𠮷

有了这种表示法之后,js共有6种方法可以表示一个字符。

console.log('\z' === 'z')      //true

console.log('\172' === 'z')    //true

console.log('\x7A' === 'z')    //true

console.log('\u007A' === 'z')  //true

console.log('\u{7A}' === 'z')  //true

什么?只有五种?再仔细看看?(滑稽)

codePointAt()

图片.png

codePointAt()方法是测试一个字符是由2个字节组成还是由4个字节组成的最简单方法。

function is32Bit(c){
    return c.codePointAt(0) > 0xFFFF;
}
console.log(is32Bit('𠮷'))    //true
console.log(is32Bit('张'))    //false

String.fromCodePoint()

es5提供了fromCodePoint()方法用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符(Unicode编码大于0xFFFF)

es6提供了String.fromCodePoint()方法,可以识别32位的UTF-16字符,弥补fromCodePoint()方法的不足,在作用上刚好与codePointAt()相反。

图片.png

normalize()

normalize()方法会按照指定的一种 Unicode 正规形式将当前字符串正规化。(如果该值不是字符串,则首先将其转换为一个字符串)。

es6新增的查找字符串方法

传统JS中只有一个indexOf()方法可以用来确定一个字符串是否包含在另一个字符串中,es6新增了includes()startsWith()endsWith()3种新方法:

includes()

图片.png 值得注意的是,不光String提供了include()方法,ArraytypedArray也有同名方法,并且其作用也都是用于判断目标是否含有指定内容。

图片.png

startsWith()

startsWith() 方法用来判断当前字符串是否以另外一个给定的子字符串开头,并根据判断结果返回 truefalse

endsWith()

显而易见,endsWith()方法与上面的startsWith()方法相反,可用来判断当前字符串是否以另外一个给定的子字符串开头。

repeat()

repeat()方法返回一个新字符串,新字符串是将原来的字符串重复n遍得到的。

图片.png

字符串补全功能

ES2017引入了引入了字符串补全长度的功能,如果某个字符串不够指定长度,会在头部或者尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

console.log('P'.padEnd(10,'a')) //Paaaaaaaaa

console.log('P'.padStart(10,'a')) //aaaaaaaaaP

console.log('P'.padEnd(10,'abc'))//Pabcabcabc

console.log('P'.padStart(10,'abc'))//abcabcabcP

模板字符串