1、字符的 Unicode 表示法
JS中,可以使用 \uxxxx
来表示一个字符,而 xxxx
就是字符的unicode 码点,而一个码点就代表 2 个字节;
'\u0061' //'a'
//也就是说 0061 是字符 a 的Unicode 码点
在ES5 中,这种表示方法的码点在 [0000, FFFF] 区间内才能正确表示字符,也就是说超过了 \uFFFF
的字符要用 4 个字节才能正确表达; 但是在ES6 中提供了改进,也就是将码点放在大括号中就可以正确表示字符;
?点击去阮老师的《ECMAScript 6 入门》查看这个字符
'\uD842\uDFB7' // "?"
'\u{20BB7}' // "?"
2、str.codePointAt()
这个方法对应的是 ES5 中的 str.charCodeAt()
,传入的参数是 n ,返回 每2个字节的值(码点的十进制值);
不过ES5 的 str.charCodeAt()
方法,不能正确处理四个字节储存的字符;
再来看看ES6 中的 str.codePointAt()
方法有什么不同:
let str = "?a"; //视为三个字符
str.codePointAt(0); //134071 ? 前两个字节的值
str.codePointAt(1); //57271 ? 后两个字节的值
str.codePointAt(2); //97 字符 a 的两个字节的值
这个方法可以用来测试一个字符是两个字节还是四个字节
function is32Bit(str){
return str.codePointAt(0) > 0xFFFF;
}
is32Bit('a'); // false
is32Bit('?'); // true
3、String.fromCodePoint()
对应ES5 的String.fromCharCode()
,不过在ES5 中,不能正确处理超出0xFFFF 的码点;
ES6 提供String.fromCodePoint()
这个方法,刚好跟codePiontAt()
相反,可以传入码点,赶回返回对应的字符,也可以传入多个参数,会返回一个字符串;
String.fromCodePoint(0x20BB7); // "?"
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y' // true
4、str.at()
这个方法还是个提案,可以返回给定字符串的指定位置的字符,可以正确处理超出0xFFFF的码点的字符;
刚刚好补上了ES5 中 str.codeAt()
的缺点;
'?'.codeAt(0); // '\uD842'
'?'.at(0); // '?'
5、str.repeat()
传入一个num,返回一个新的字符串,将str 重复num 次;
如果num 是正小数,会向下取整,在(-1, 0] 区间内,则会取 0;
如果num 是 <= -1 的负数或者是Infinity 则会报错;
如果num 是NaN,则取 0;
如果传入的是一个字符串,则会将这个字符串先转成数字;
let str = 'ha';
str.repeat(0); // ' '
str.repeat(2); // 'haha'
str.repeat(3.3); //'hahaha'
str.repeat(-0.5); // ' '
str.repeat(-1); // RangeError
str.repeat(Infinity); // RangeError
str.repeat(NaN); // ' '
str.repeat('3'); // 'hahaha'
6、str.includes()、str.startsWith()、str.endsWith()
在ES5 中,只有str.indexOf()
来确定一个字符串里是否含有另一个字符串;
在ES6 中,提供新方法:
str.includes()
:返回一个布尔值来表示字符串str 中是否存在存在参数字符串;
str.startsWith()
: 返回一个布尔值来表示字符串str 的头部是否存在存在参数字符串;
str.endsWith()
: 返回一个布尔值来表示字符串str 的尾部是否存在存在参数字符串;
三个方法都支持传入第二个参数num,来表示搜索的开始位置(包含num):
let str = 'abcdefg';
str.includes('bcd',1); // true
str.startsWith('fg',5); // true 这个方法的第二个参数表示的是在第num个到结束位置的字符中查找
str.endsWith('d',3); // false 这个方法的第二个参数表示的是在前num个字符中查找
7、str.padStart()、 str.padEnd()
这两个方法如名字所表示的,都用来补全字符串,接收连个参数: num 和 s ;
num 则表示补全后的字符串的长度,而参数 s 表示用什么字符来补(不传入s,则会用空格来填补);
let str = 'welcome';
str.padStart(8,'ddd'); //'dwelcome'
str.padStart(9,'ddd'); //'ddwelcome'
str.padStart(6,'ddd'); //'welcome' num 小于原字符串的长度,直接返回原字符串
str.padEnd(8,'ddd'); //'welcomed'