Avatar ·

Как удалить последний символ из строки в JavaScript? Методы slice, substring и replace

Всем привет! Я новичок в JavaScript и столкнулся с такой проблемой.

У меня есть строка, например: "Hello, world!". Мне нужно удалить из неё последний символ (восклицательный знак), чтобы получить "Hello, world". Я знаю, что строки в JS неизменяемы, но можно создать новую строку без последнего символа.

Я пробовал использовать trim(), но он удаляет только пробелы в начале и конце строки. Потом нашёл метод slice(), но не до конца понял, как с ним работать с отрицательными индексами. Ещё видел в интернете примеры с substring() и replace(), но они иногда ведут себя странно.

Подскажите, пожалуйста, какой самый надёжный и производительный способ удалить последний символ из строки? И объясните, чем отличаются slice(), substring() и substr() в этом контексте? Заранее спасибо!

Пример моего кода:

let str = "Привет!";
// Хочу получить "Привет"
let result = str.trim(); // Не работает
console.log(result); // "Привет!"
<<>>

Лучший способ: метод slice()

Самый простой, читаемый и производительный способ удалить последний символ — использовать метод slice() с отрицательным индексом:

let str = "Hello, world!";
let result = str.slice(0, -1);
console.log(result); // "Hello, world"

Как это работает:

  • slice(startIndex, endIndex) копирует часть строки от startIndex до endIndex (не включая его).
  • Если передать отрицательное значение, оно отсчитывается от конца строки. -1 — это последний символ.
  • Таким образом, slice(0, -1) берёт все символы с начала (индекс 0) до предпоследнего (индекс -1 не включается).

Почему это лучший вариант?

  • Читаемость: Код интуитивно понятен: "взять от начала до предпоследнего".
  • Производительность: slice() работает быстрее substring() и replace() в большинстве браузеров.
  • Безопасность: Работает корректно с пустыми строками (вернёт пустую строку) и строками из одного символа (вернёт пустую строку).
  • Поддержка: Работает во всех браузерах, включая старые IE.

Альтернативы и их особенности

1. substring()

let str = "Hello!";
let result = str.substring(0, str.length - 1);
console.log(result); // "Hello"

Минусы: нужно явно вычислять длину (str.length - 1). Не поддерживает отрицательные индексы (они будут преобразованы в 0).

2. substr() (устарел!)

let str = "Hello!";
let result = str.substr(0, str.length - 1);

Не рекомендуется к использованию — помечен как deprecated в спецификации ECMAScript.

3. replace() с регулярным выражением

let str = "Hello!";
let result = str.replace(/.$/, '');
console.log(result); // "Hello"

Работает, но медленнее и менее читаемо. .$ означает "любой символ в конце строки". Минус: если строка содержит перенос строки \n, может удалить его, а не последний видимый символ.

Важные замечания

  • Все методы не изменяют исходную строку, а возвращают новую.
  • Если строка пустая (""), slice(0, -1) вернёт "".
  • Если нужно удалить последние N символов, используйте slice(0, -N).

Рекомендую использовать slice(0, -1) как стандартный паттерн — он короткий, понятный и быстрый.

<<>>

Альтернативный подход: использование splice для строк (через массив)

Иногда нужно не просто удалить последний символ, а выполнить более сложную операцию. В таких случаях можно преобразовать строку в массив, использовать splice() и затем объединить обратно:

let str = "JavaScript";
let arr = str.split('');   // ["J","a","v","a","S","c","r","i","p","t"]
arr.splice(-1, 1);         // Удаляем 1 элемент с конца
let result = arr.join(''); // "JavaScrip"
console.log(result);

Когда это может пригодиться?

  • Если нужно удалить не последний символ, а, например, третий с конца.
  • Если нужно удалить несколько символов в разных позициях.
  • Если вы уже работаете с массивом и хотите остаться в той же парадигме.

Минусы:

  • Медленнее, чем slice() (два прохода: split + join).
  • Избыточно для простого удаления последнего символа.

Также стоит помнить, что этот подход ломает суррогатные пары (эмодзи, некоторые редкие символы). Например, смайлик 😊 состоит из двух UTF-16 единиц, и split('') разобьёт его неправильно. Для корректной работы с эмодзи лучше использовать Array.from(str) или оператор распространения:

let str = "Привет😊";
let arr = [...str]; // Правильно разбивает эмодзи
arr.splice(-1, 1);
console.log(arr.join('')); // "Привет"

Но для 99% случаев (латиница, кириллица, цифры) slice(0, -1) — это оптимальное решение.