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

瀏覽器相容性

另見