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

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 — нормальный пробел