如果非要给这几种方法划清一下界限,
fromCharCode(),charCodeAt(),charAt()
是ES5中的字符串方法,其中fromCharCode()
用于String
对象,charCodeAt(),charAt()
用于字符串的实例方法;
fromCodePoint(),codePointAt()
是ES6新增的特性,fromCodePoint()
用于String
对象,codePointAt()
用于字符串的实例方法;
有了上面的概述,使用起来也更容易区分了。
1. fromCharCode() & charCodeAt()
fromCharCode()
是String构造函数的一个静态方法,接收1个或多个
字符编码,将它们转化为字符串。这个方法与实例方法charCodeAt()
执行的是相反的操作。
String.fromCharCode(49) //'1'
String.fromCharCode(49,50,51,52) //'1234'
let a = '1234';
a.charCodeAt(); //49
a.charCodeAt(0); //49
a.charCodeAt(1); //50
a.charCodeAt(2); //51
2. charAt()
charAt()
返回指定位置的字符,如果指定位置不在字符串长度之内,会返回一个空字符串.
let a = '1234';
a.charAt(0); //'1'
a.charAt(1); //'2'
a.charAt(-1); //'' (空字符串)
ES5中还定义了另一个访问个别字符的方法,使用方括号+数字索引:
let a = '1234';
a[0]; //'1'
a[1]; //'2'
a[-1]; //undefined
3. fromCodePoint() & codePointAt()
其实ES5中的String.fromCharCode()
方法不能单独获取在高代码点位上的字符,即不能识别 32 位的 UTF-16 字符(Unicode 编号大于0xFFFF)。
ES6中新增的方法fromCodePoint()
,可以识别大于0xFFFF的字符,弥补了String.fromCharCode()
方法的缺点。在执行上与codePointAt()
操作相反。
String.fromCodePoint(42); // "*"
String.fromCodePoint(65, 90); // "AZ"
String.fromCodePoint(0x404); // "\u0404"
String.fromCodePoint(0x2F804); // "\uD87E\uDC04"
String.fromCodePoint(194564); // "\uD87E\uDC04"
String.fromCodePoint(0x1D306, 0x61, 0x1D307) // "\uD834\uDF06a\uD834\uDF07"
'ABC'.codePointAt(1); // 66
'\uD800\uDC00'.codePointAt(0); // 65536
'XYZ'.codePointAt(42); // undefined