String.prototype.codePointAt()
codePointAt()
是 String
值的一个方法,它返回一个非负整数,该整数是指定索引处开始的字符的 Unicode 代码点值。请注意,索引仍然基于 UTF-16 代码单元,而不是 Unicode 代码点。
试试看
语法
js
codePointAt(index)
参数
返回值
一个非负整数,表示指定 index
处字符的代码点值。
- 如果
index
超出0
–str.length - 1
的范围,则codePointAt()
返回undefined
。 - 如果
index
处的元素是 UTF-16 前导代理,则返回代理对的代码点。 - 如果
index
处的元素是 UTF-16 尾随代理,则仅返回尾随代理代码单元。
描述
字符串中的字符从左到右索引。第一个字符的索引为 0
,名为 str
的字符串中最后一个字符的索引为 str.length - 1
。
Unicode 代码点范围从 0
到 1114111
(0x10FFFF
)。在 UTF-16 中,每个字符串索引都是一个代码单元,其值为 0
– 65535
。较高的代码点由一对 16 位代理伪字符表示。因此,codePointAt()
返回一个可能跨越两个字符串索引的代码点。有关 Unicode 的信息,请参阅 UTF-16 字符、Unicode 代码点和音节簇。
示例
使用 codePointAt()
js
"ABC".codePointAt(0); // 65
"ABC".codePointAt(0).toString(16); // 41
"😍".codePointAt(0); // 128525
"\ud83d\ude0d".codePointAt(0); // 128525
"\ud83d\ude0d".codePointAt(0).toString(16); // 1f60d
"😍".codePointAt(1); // 56845
"\ud83d\ude0d".codePointAt(1); // 56845
"\ud83d\ude0d".codePointAt(1).toString(16); // de0d
"ABC".codePointAt(42); // undefined
使用 codePointAt() 循环
由于使用字符串索引进行循环会导致访问同一个代码点两次(一次用于前导代理,一次用于尾随代理),并且第二次 codePointAt()
仅返回尾随代理,因此最好避免按索引循环。
js
const str = "\ud83d\udc0e\ud83d\udc71\u2764";
for (let i = 0; i < str.length; i++) {
console.log(str.codePointAt(i).toString(16));
}
// '1f40e', 'dc0e', '1f471', 'dc71', '2764'
相反,可以使用 for...of
语句或 扩展字符串,这两者都会调用字符串的 [Symbol.iterator]()
,该方法按代码点进行迭代。然后,使用 codePointAt(0)
获取每个元素的代码点。
js
for (const codePoint of str) {
console.log(codePoint.codePointAt(0).toString(16));
}
// '1f40e', '1f471', '2764'
[...str].map((cp) => cp.codePointAt(0).toString(16));
// ['1f40e', '1f471', '2764']
规范
规范 |
---|
ECMAScript 语言规范 # sec-string.prototype.codepointat |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。