Являются ли строки (String) в JavaScript изменяемыми (мутабельными)?

«Являются ли строки (String) в JavaScript изменяемыми (мутабельными)?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, строки в JavaScript иммутабельны (неизменяемы). Это фундаментальное свойство языка, которое влияет на написание кода как на клиенте, так и в Node.js.

Что это значит на практике? Любая операция, которая якобы "изменяет" строку, на самом деле создаёт новую строку. Оригинальная строка остаётся в памяти неизменной.

Примеры в Node.js:

// 1. Прямое присваивание по индексу не работает
let greeting = 'Hello';
greeting[0] = 'h'; // Никакой ошибки, но и эффекта нет
console.log(greeting); // Вывод: 'Hello'

// 2. Методы возвращают новые строки
let original = '  node.js  ';
let trimmed = original.trim();  // Создаётся новая строка 'node.js'
let upperCased = original.toUpperCase(); // Новая строка '  NODE.JS  '
console.log(original); // Вывод: '  node.js  ' (без изменений)
console.log(trimmed);  // Вывод: 'node.js'

// 3. Конкатенация создаёт новую строку
let part1 = 'Hello';
let part2 = ' World';
let combined = part1 + part2; // Создаётся новая строка 'Hello World'
console.log(part1); // Вывод: 'Hello' (без изменений)

Почему это важно и как это используется в Node.js?

  • Безопасность и предсказуемость: Передавая строку в функцию, вы уверены, что она не будет изменена где-то внутри. Это критично для ключей, токенов, путей к файлам.
  • Оптимизация (интернирование): Движок V8 (на котором работает Node.js) может кэшировать идентичные строки, используя одну область памяти.
  • Сравнение по значению: Так как строки неизменяемы, их можно безопасно сравнивать по значению.
  • Работа с большими строками: Частые операции (например, в цикле) могут приводить к созданию множества промежуточных строк и утечкам памяти. Для интенсивных манипуляций со строками в Node.js иногда используют буферы (Buffer) или массивы символов.