JavaScript: Неизменность / Иммутабельность строк
Новичкам часто говорят, что в JavaScript строки неизменяемы/иммутабельны
. Однако простая констатация этого факта не проясняет, как это функционально применяется при написании кода. Часто, когда новички учатся, изменения
строк происходят постоянно. Вы узнаете, как выполнять операции и срезы; повторно объявлять переменную в новую строку.
Здесь может возникнуть путаница. Если вы действительно не понимаете, что происходит, легко подумать, что мы на самом деле меняем исходную строку. Но в том-то и дело, вы не меняете исходную строку; вы меняете переменную. Вы выполняете операцию с исходной строкой, которая возвращает результат операций выполненных с исходной строкой, без изменения исходной строки.
Понимая это, становится более понятным, почему вам нужно переназначать переменную (или создавать новую) каждый раз, когда вы хотите сохранить результат своих операций в строке.
Допустим, у вас есть переменная let x = 'string'
— Даже если вы сделаете x[0] = 't'
, вы не измените x
на 'ttring'
, как вы могли ожидать. x
по-прежнему будет равно 'string'
. Однако, это не означает, что вы не можете добиться желаемого результата. Допустим, вы хотите чем-то дополнить строку. В JavaScript есть удобный инструмент ``
литералы шаблона; они позволяют создавать строки с использованием переменных. Итак, если у вас есть x
и вы хотите добавить '*'
в начало и конец x
, а так же заменить x[0]
на 't'
, вы можете сделать x = `*t${x.slice(1)}*`
, и теперь x = '*ttring*'
.
Здесь происходит то, что мы присваиваем x
значение фрагмента исходной строки начиная с индекса 1 'tring'
с 't'
до фрагмента и '*'
с обеих сторон.
В конце концов мы так и не изменили исходную строку; x
теперь указывает на новую и другую строку, которая была результатом операций выполненных над предыдущим значением x
(исходной строки). Результатом является та же самая переменная, содержащая совершенно другую строку, причём исходная строка теперь утеряна или в сборщике мусора (если не сохранена где-то ещё). И хотя она может быть утеряна, с функциональной точки зрения мы никогда не меняли исходную строку.