Автор оригинала: Kumar Abhishek.
Обзор
- JavaScript использует кодировку UTF-16 для строки.
- Строка формирования персонажа может быть из BMP или Non-BMP Отказ
- Длина строки – это не что иное, как количество единиц 16-бит-блока памяти. Например, если длина строки составляет 4, это означает, что она имеет 4 единицы 16-битвых широких блоков памяти.
- Каждое BMP символы могут быть представлены с использованием одного блока 16 битов блока памяти.
- Каждое не используемые символы не BMP могут быть представлены с использованием 2 единиц 16-битных блоков памяти (I.E 32 бита или 4 октаунта). Например, символы японских или эмодзи могут быть размером 2 единицы.
- Математически говорящий размер или длина строки в JavaScript имеет вид
х + y
,х
Общее количество символов (включая как BMP, так и не BMP символы), так иy
Общее количество символов не BMP (Y –0
Если строка имеет только символы BMP). То есть для каждого персонажа Non BMP одна дополнительная единица блока памяти 16-битсов способствует общему размеру или длине этой строки.
Иллюстрация
Давайте рассмотрим строку «Hello😛». Теперь мы получаем 7 как длина этой строки:
'Hello😛'.length; // 7
Здесь «H», «E», «l ',' l ',' o ',' 😛 '
составляют 6 единиц до размера (или длины) всей строки. Как '😛'
Является ли символ Non BMP, его будет способствовать 1 дополнительной единице. Другими словами, строка имеет 1 символ Non-BMP, который приводит к общему размеру вышеуказанной струны 6 +
Отказ Так что связать это с математической формулой х + y
мы можем написать х
(Общее количество чурки) и y
(количество персонажа без BMP ‘😛’).
Подразумеваемое
Мы видели, что строка в JavaScript имеет форму х + y
Отказ Также строка в JavaScript – это не что иное, как массив блоков памяти, а не символы. Другими словами, определенный блок памяти в строке S
В определенном положении индекса Я
может быть получен с использованием s [я]
Отказ Самое большое заблуждение между людьми в том, что S [I] средний характер в положении я в строке S
Отказ Это верно только для такой строки, которая имеет только символы BMP. В тот момент, когда символ Non-BMP происходит в строке, позиция всех последующих символов затронута из-за того, что характеристики персонажа без BMP более 2 единиц блока памяти. Это может быть понято очень легко, следующим примером:
Рассмотрим строку «Hello😛world». Таким образом, когда мы доступаем к блоку String S по блоку памяти, пока персонаж «O» мы получаем:
s[0] 'H's[1] 'e's[2] 'l's[3] 'l's[4] 'o'
Что вы думаете, ценность S [5]
было бы ? Ну, мы получим «�», так как значение блока памяти S [5] не отображается на любого печатающего/рендерируемого символа. «�» – это просто заполнитель, выбранный браузером, чтобы изобразить, что он не может рендерировать такой характер. То же самое верно для S [6], которое показывает «�». Мы можем получить десятичный эквивалент S [5] и S [6] или данных, хранящихся в блоке памяти S [5] и S [6], как показано ниже:
s[5] // '�'s[6] // '�'s[5].charCodeAt(0) // 55357s[6].charCodeAt(0) // 56859
Написание значений блока памяти на S [5] и S [6] в шестнадцатеричном мы получим:
s[5] // 0xD83Ds[6] // 0xDE1B
Так что вместе S [5] и S [6] представляют собой «😛». То есть пара данных пара 0xD83D и 0xDE1B вместе представляют один символ не BMP ‘😛’. Эта пара данных (пара 16-битч) называется Суррогатные пары Отказ
Вызовы
Мы увидели выше, чтобы 2 единицы блоков памяти (суррогатные пары) необходимы для каждого персонажа без BMP, это прививет нормальную итерацию на символы строки в JavaScript. Это препятствует рассмотрению строки в качестве массива характера для количества таких, как подсчет частот символа в строке, замена символа в строку, добавление символов в строке и т. Д. Короче говоря, какая-либо натуральная строка, связанная с ними Персонаж становится ошибочно с наличием символа Non-BMP в строке. К счастью, у нас есть обходные пути для этой проблемы. Мы посмотрим, как этот обходной путь работает дальше.
Обходной путь
Для любой практической цели рассмотрения строки в качестве массива нам сначала нужно сломать строку в массив символов (обоих типов: BMP и Non-BMP). То есть этот массив будет иметь точно такое же количество предметов, что и количество символов (осознавать его не Lenggth или размер строки!). Учитывая тот же пример струны «Hello😛world»
Еще раз мы можем преобразовать его в массив символов, как показано ниже:
const [...ca] = 'Hello😛World';ca // (11) ["H", "e", "l", "l", "o", "😛", "W", "o", "r", "l", "d"]
Как и в JavaScript Array элементы, не должны быть однородными, и каждое элементы могут быть любого типа данных, а также любой размер данных. Так над массивом символов CA
состоит из 11 предметов, каждый из которых представляет собой символ (типа BMP, так и BMP, так и не BMP SEAMLESLY). Это то, что мы хотели за нашу на основе строкой обработки. Например, если мы хотим подсчитать частоты символов в приведенной выше строке, мы можем получить его, как показано ниже:
const [...ca] = 'Hello😛World';ca.reduce((obj, v) => { obj[v] = obj[v] || 0; ++obj[v]; return obj; }, {});H: 1e: 1l: 3o: 2😛: 1W: 1r: 1d: 1
Заключение
- Строка в JavaScript состоит из символов UTF-16 с каждым символом, имеющим размер 1 (в случае символа BMP) или 2 единицы (в случае символов не-BMP) 16-битных блоков памяти.
- Строка в JavaScript не является массивом символов, а массив памяти блокирует каждый из 16-бит.
- Каждый символ Non-BMP промежутлен более 2 единичной памяти 16-битров, тем самым вносит одну дополнительную единицу на символ на длину строки.
- Длина или размер javaScript String можно представить матросмысленно
х + y
гдех
общее количество символов иy
Общее количество символов не BMP. - Оператор Spreade ES6 может использоваться для преобразования строки в массив символов.