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 |