JavaScript | replaceAll() не работает — efim360.ru

JavaScript | replaceAll() не работает

Столкнулся с такой проблемой, что метод replaceAll() не работает, но я ошибался. Надеюсь помогу тебе решить твою проблему.

Я писал статью на тему "Как заменить двойные пробелы на одинарные?". Задача проще не придумаешь. У меня была строка для экспериментов, которую я скопировал из редактора статей CMS WordPress. Я заранее сделал в строке три двойных пробела. Выглядела она так:

var stroka = "Я  люблю  работать со строковым  типом данных."
Строка с двойными пробелами - JavaScript
Строка с двойными пробелами - JavaScript


Вызываю на строке метод replaceAll() и вижу, что ничего не изменилось:

stroka.replaceAll("  ", " ")

В ответ те же самые двойные пробелы. Сознание немного помутнело от того, что даже на JavaScript положиться уже нельзя. Уныние, разочарование. Вроде читаешь официальный мануал, а на деле получаешь "не то".

Замена двойных пробелов в строке на одинарные - JavaScript
Замена двойных пробелов в строке на одинарные - JavaScript

Стал разбираться с проблемой. Т. к. я немного знаком с таким понятием как ASCII (American standard code for information interchange), то первое что пришло в голову - "мои клавиатурные пробелы в строках в методе replaceAll() могут каким то образом отличаться от скопированных из редактора". Мне об этом легко говорить т. к. кроме пробелов ничего больше не сравнивалось.

Решил создать дополнительную строковую переменную в которую вводил символы двойных пробелов с клавиатуры.

Переменная str из двух пробелов - JavaScript
Переменная str из двух пробелов - JavaScript

Я знал, что существуют печатные и непечатные символы, которые имеют свои уникальные КОДЫ СОПОСТАВЛЕНИЯ. Например, спецсимволы "переноса строки" и "возврата каретки", которые используются во всех редакторах кода. Именно поэтому существует такое понятие как КОДИРОВКА СИМВОЛОВ. То есть помимо графического / логического представления, есть уникальное числовое представление любого символа в IT.

Я прогнал обе строки на получение СИМВОЛЬНЫХ КОДОВ. И вот что получилось:

massiv.map(i => [i, i.charCodeAt()])
Двойной пробел - коды 160, 32 - JavaScript
Двойной пробел - коды 160, 32 - JavaScript
Array.from(str).map(i => [i, i.charCodeAt()])
Двойной пробел - коды 32, 32 - JavaScript
Двойной пробел - коды 32, 32 - JavaScript

 

В моей строке было два символьных кода - 32, 32

А в строке из Вордпресс была пара - 160, 32

 

Теперь всё встало на свои места. Метод замены пытается отыскать пару "32, 32", но не находит, потому что её просто не существует в первоначальной строке. Но стоит подать правильную пару "160, 32", как результат становится предсказуемым - выполненным правильно. Пару пробелов "160, 32" скопировал уже из консоли.

Пара 160, 32 скопирована из консоли - JavaScript
Пара 160, 32 скопирована из консоли - JavaScript

Надеюсь эта публикация откроет новый взгляд на мир символов в IT.

Символьный код 160 - неразрывный пробел
Символьный код 160 - неразрывный пробел
Символьный код 032 - нормальный пробел
Символьный код 032 - нормальный пробел
Поделись записью