String.prototype.codePointAt()
codePointAt() 方法用於獲取字串中給定索引處的 Unicode 碼點值,返回一個非負整數。請注意,索引仍然基於 UTF-16 碼單元,而不是 Unicode 碼點。
試一試
const icons = "☃★♲";
console.log(icons.codePointAt(1));
// Expected output: "9733"
語法
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® 2026 語言規範 # sec-string.prototype.codepointat |
瀏覽器相容性
載入中…