String.prototype.codePointAt()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 2015 年 9 月以来,该特性已在各大浏览器中可用。

codePointAt() 方法用于获取字符串中给定索引处的 Unicode 码点值,返回一个非负整数。请注意,索引仍然基于 UTF-16 码单元,而不是 Unicode 码点。

试一试

const icons = "☃★♲";

console.log(icons.codePointAt(1));
// Expected output: "9733"

语法

js
codePointAt(index)

参数

index

要返回的字符的基于零的索引。 转换为整数undefined 会被转换为 0。

返回值

一个表示给定 index 处字符码点值的非负整数。

  • 如果 index 超出 0str.length - 1 的范围,codePointAt() 将返回 undefined
  • 如果 index 处的元素是 UTF-16 的代理对中的前导代理,则返回该代理的码点。
  • 如果 index 处的元素是 UTF-16 的代理对中的后导代理,则返回后导代理码单元。

描述

字符串中的字符从左到右索引。第一个字符的索引是 0,名为 str 的字符串中最后一个字符的索引是 str.length - 1

Unicode 码点范围为 01114111 (0x10FFFF)。在 UTF-16 中,每个字符串索引都是一个值为 065535 的码单元。较高的码点由一对 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® 2026 语言规范
# sec-string.prototype.codepointat

浏览器兼容性

另见