String.prototype.codePointAt()

Метод codePointAt() повертає невід'ємне число, що відповідає значенню коду Unicode символу за вказаною позицією.

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

Синтаксис

codePointAt(pos)

Параметри

pos

Позиція елемента в рядку str, код якого слід повернути.

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

Десяткове число, яке відповідає значенню коду символу, що знаходиться в рядку за вказаною позицією pos.

  • Якщо за вказаною позицією pos нічого немає, повертається undefined.
  • Якщо за позицією pos знаходиться старший сурогат UTF-16, повертається код цілої сурогатної пари.
  • Якщо за позицією pos знаходиться молодший сурогат UTF-16, повертається лише код молодшого сурогату.

Приклади

Застосування 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()

Оскільки звертання за індексом pos до елементу, який є молодшим сурогатом UTF-16, повертає лише код молодшого сурогату, краще не звертатися за індексом безпосередньо до рядка UTF-16.

Натомість можна вжити інструкцію for...of або метод forEach() масиву (чи будь-що інше, що перебирає сурогати UTF-16 правильно) для перебирання елементів рядка, викликаючи codePointAt(0) для отримання коду кожного елемента.

for (let codePoint of '\ud83d\udc0e\ud83d\udc71\u2764') {
   console.log(codePoint.codePointAt(0).toString(16))
}
// '1f40e', '1f471', '2764'

Поліфіл

Наступний код розширяє об'єкт рядка таким чином, що він отримує функцію codePointAt(), відповідну до вказаної в ECMAScript 2015, у браузерах без її нативної підтримки.

/*! https://mths.be/codepointat v0.2.0 by @mathias */
if (!String.prototype.codePointAt) {
  (function() {
    'use strict'; // необхідна підтримка `apply`/`call` зі значеннями `undefined`/`null`
    var defineProperty = (function() {
      // IE 8 підтримує `Object.defineProperty` лише на DOM-елементах
      try {
        var object = {};
        var $defineProperty = Object.defineProperty;
        var result = $defineProperty(object, object, object) && $defineProperty;
      } catch(error) {}
      return result;
    }());
    var codePointAt = function(position) {
      if (this == null) {
        throw TypeError();
      }
      var string = String(this);
      var size = string.length;
      // "До цілого"
      var index = position ? Number(position) : 0;
      if (index != index) { // `isNaN`, але кращий
        index = 0;
      }
      // Перевірка індексу на вихід за межі
      if (index < 0 || index >= size) {
        return undefined;
      }
      // Отримання першої кодової одиниці
      var first = string.charCodeAt(index);
      var second;
      if ( // перевірка, чи це частина сурогатної пари
        first >= 0xD800 && first <= 0xDBFF && // старший сурогат
        size > index + 1 // пересвідчується, що попереду іще є принаймні одна кодова одиниця
      ) {
        second = string.charCodeAt(index + 1);
        if (second >= 0xDC00 && second <= 0xDFFF) { // молодший сурогат
          // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
          return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
        }
      }
      return first;
    };
    if (definePropertyis available inointAt,
        'configurable': true,
        'writable': true
      });
    } else {
      String.prototype.codePointAt = codePointAt;
    }
  }());
}

Специфікації

Сумісність із браузерами

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

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