String.prototype.codePointAt()
Метод codePointAt()
(кодова точка на позиції) значень String
повертає невід'ємне число, що відповідає значенню кодової точки Unicode символу, що починається за вказаним індексом. Зверніть увагу на те, що індекс – все одно заснований на кодових одиницях UTF-16, а не кодових точках Unicode.
Спробуйте його в дії
Синтаксис
codePointAt(index)
Параметри
index
Індекс від нуля символу, що повинен бути повернений. Перетворюючись на ціле число —
undefined
перекидається на 0.
Повернене значення
- Якщо
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()
"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()
повертає лише кінцевий сурогат, краще уникати циклів за індексом.
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)
, щоб отримати кодову точку кожного елемента.
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']
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
codePointAt
|
Chrome Full support 41 | Edge Full support 12 | Firefox Full support 29 | Internet Explorer No support Ні | Opera Full support 28 | Safari Full support 10 | WebView Android Full support 41 | Chrome Android Full support 41 | Firefox for Android Full support 29 | Opera Android Full support 28 | Safari on iOS Full support 10 | Samsung Internet Full support 4.0 | Deno Full support 1.0 | Node.js Full support 4.0.0 |