String.prototype.codePointAt()

Метод codePointAt() (кодова точка на позиції) значень String повертає невід'ємне число, що відповідає значенню кодової точки Unicode символу, що починається за вказаним індексом. Зверніть увагу на те, що індекс – все одно заснований на кодових одиницях UTF-16, а не кодових точках Unicode.

Спробуйте його в дії

Синтаксис

codePointAt(index)

Параметри

index

Індекс від нуля символу, що повинен бути повернений. Перетворюючись на ціле числоundefined перекидається на 0.

Повернене значення

  • Якщо index лежить поза діапазоном 0str.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 або розгорнути рядок, – обидва способи закликають @@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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
codePointAt
Chrome Full support 41
Edge Full support 12
Firefox Full support 29
Internet Explorer No support No
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

Дивіться також