字符串中有两种字符,一种是由16位的代码单元表示的BMP字符,另一种是由两个32位的代码单元表示的辅助平面字符在ES5中,所有的字符串操作都是基于16位代码单元codePointAtcodePointAt接受代码单元的位置而不是字符位置作为参数,返回字符串中给定位置对应的代码点,即整数值。也就是说,对于BMP字符集中的字符,codePointAt方法的返回值与charCodeAt方法相同,但非BMP字符集的返回值不同lettxt='?a'console.log(txt.charCodeAt(0))//55362--只返回位置0的第一个编码单元console.log(txt.charCodeAt(1))//57271console.log(txt.charCodeAt(2))//97console.log(txt.codePointAt(0))//134071--返回完整的代码点,即使这个代码点包含多个代码单元console.log(txt.codePointAt(1))//57271console.log(txt.codePointAt(2))//97检测字符占用的代码单元个数functionis32Bit(c){returnc.codePointAt(0)>0xFFFF}console.log(is32Bit('?'))//trueconsole.log(is32Bit('a'))//falseString.fromCodePointcodePoint方法获取字符串中某个字符的codepoint,也可以使用String.fromCodePoint方法根据指定的codepoint生成一个字符。你可以认为String.fromCodePoint是String.fromCharCode的更完整版本,因为对于BMP中的所有字符,两种方法的结果是一样的,只是传递了非BMP代码。当使用bit作为参数时,两者的执行结果可能不同。当normalize对不同的字符进行排序或比较时,它们可能是等价的。每个序列的代码点是无法区分的2.两个兼容的代码点序列看起来不同,但在某些情况下可以互换使用。记住:在比较字符串之前,必须将它们归一化为相同的形式letvalues=[“测试”、“演示”、“比较”、“排序”]letnormalized=values.map(function(txt){returntxt.normalize()})normalized.sort(function(first,second){if(first
