JavaScript: Неизменность / Иммутабельно­сть строк

Источник: «JavaScript String Immutability»
Я вижу много путаницы в отношении неизменяемости/иммутабельности строк и подумал, что сделаю всё возможно, чтобы прояснить, что это значит для запутавшихся.

Новичкам часто говорят, что в 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 (исходной строки). Результатом является та же самая переменная, содержащая совершенно другую строку, причём исходная строка теперь утеряна или в сборщике мусора (если не сохранена где-то ещё). И хотя она может быть утеряна, с функциональной точки зрения мы никогда не меняли исходную строку.

Дополнительные материалы

Предыдущая Статья

Laravel: Чистка контроллеров

Следующая Статья

Laravel: Как сделать ваше приложение более тестируемым