String.fromCodePoint()
String.fromCharCode()
方法不能识别码点大于0xFFFF的字符,String.fromCodePoint()
方法弥补了上述方法的不足
注意:fromCodePoint
方法定义在String
对象上,而codePointAt
方法定义在字符串的实例对象上。
String.raw()
该方法返回一个斜杠都被转义的字符串,如下
String.raw`Hi\\n`
// 返回 "Hi\\\\n"
String.raw`Hi\\n` === "Hi\\\\n" // true
String.raw()方法也可以作为一个正常的函数使用。第一个参数是一个具有raw属性的对象,,raw属性的值应该是一个数组
String.raw({ raw: 'test' }, 0, 1, 2);
// 't0e1s2t'
// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);
codePointAt()
对于四个字节的字符,JavaScript不能正确处理,但codePointAt()方法能正确处理4个字节存储的字符,返回一个字符的码点
let s = 'a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97
这个方法返回的码点是十进制的,可以用toString()
方法转化成十六进制的
let s = 'a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"
上面代码的字符串‘a’应该是在位置1的,但是必须向codePointAt()方法中传入2。可以用for...of
循环解决问题。另外,也可以用扩展运算符(...
)进行展开运算
let s = 'a';
for (let ch of s) {
console.log(ch.codePointAt(0).toString(16));
}
// 20bb7
// 61
let arr = [...'a']; // arr.length === 2
arr.forEach(
ch => console.log(ch.codePointAt(0).toString(16))
);
// 20bb7
// 61
可以用codePointAt()
方法测试一个 字符由两个字节还是四个字节组成的。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("") // true
is32Bit("a") // false
normalize()
normalize()
方法用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。
normalize
方法可以接受一个参数来指定normalize
的方式,参数的四个可选值如下。
-
NFC
,默认参数,表示“标准等价合成”,返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。 -
NFD
,表示“标准等价分解”,即在标准等价的前提下,返回合成字符分解的多个简单字符。 -
NFKC
,表示“兼容等价合成”,返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize
方法不能识别中文。) -
NFKD
,表示“兼容等价分解”,即在兼容等价的前提下,返回合成字符分解的多个简单字符。
repeat()
这个方法返回一个字符串,表示将原字符串重复n次。如果参数是小数,则会被取整。参数是负数或者Infinity
,会报错。
但是,如果参数是 0 到-1 之间的小数,则等同于 0,这是因为会先进行取整运算。
trimStart(),trimEnd()
trimStart()
消除字符串头部的空格,trimEnd()
消除尾部的空格
参考资料
阮一峰《ECMAScript 6 入门》