JavaScript substring: извлечение текста по индексам
Метод JavaScript substring извлекает символы между двумя позициями индекса и возвращает новую строку. Он принимает начальный индекс и необязательный конечный индекс (не включая его), беря всё от start до end. Когда конечный индекс пропущен, извлечение продолжается до конца строки. В отличие от slice, substring автоматически меняет аргументы местами, если start больше end, поэтому вы не получаете случайный пустой результат.
Пример JavaScript Substring для извлечения текста
Вывод:
Результат появится здесь...
Вывод:
Имя: report-2024
Расширение: csv
Как работает этот пример
filename.lastIndexOf(".")возвращает11— позицию последней точки в строке.filename.substring(0, 11)извлекает символы от индекса0до (не включая) индекса11, получая"report-2024".filename.substring(12)вызывается без второго аргумента, поэтому извлечение идёт от индекса12до конца строки и возвращает"csv".- Оба вызова возвращают новые строки, а исходная
filenameне изменяется, потому что строки в JavaScript неизменяемы.
Частые ошибки с JavaScript substring
Ожидать, что отрицательные индексы считаются от конца.
Неправильно:
"hello".substring(-3); // "hello", а не "llo"
Правильно:
"hello".slice(-3); // "llo"
substring ограничивает отрицательные значения до 0, поэтому substring(-3) превращается в substring(0) и возвращает всю строку. Для смещений от конца используйте slice.
Воспринимать второй аргумент как длину.
Неправильно:
"abcdef".substring(2, 3); // "c", а не "cde"
Правильно:
"abcdef".substring(2, 5); // "cde"
Второй параметр — это конечный индекс, а не количество символов. Эта путаница часто возникает из-за устаревшего substr(start, length), где "abcdef".substr(2, 3) возвращает "cde". При переходе с substr переводите длину в конечный индекс: start + length.
JavaScript substring и slice
| Поведение | substring(start, end) | slice(start, end) |
|---|---|---|
| Отрицательные аргументы | Ограничиваются до 0 | Считаются от конца строки |
start > end | Аргументы автоматически меняются местами | Возвращает пустую строку "" |
| Индекс вне диапазона | Ограничивается до string.length | Ограничивается до string.length |
| Изменяет исходную строку | Нет | Нет |
Используйте substring, когда индексы получаются из вычислений и могут прийти в неправильном порядке: авто-перестановка гарантирует корректный результат. Используйте slice, когда отрицательные смещения заданы осознанно, например чтобы получить последние N символов через str.slice(-N).
Замена устаревшего substr на substring
Устаревший метод substr(start, length) (часто его ищут как JavaScript substr) всё ещё встречается в старом коде и помечен как deprecated в документации. Путаница между JavaScript substr и substring обычно связана с разным смыслом второго аргумента: substr принимает длину, а substring — конечный индекс. Чтобы миграция была безопасной:
- Замените
str.substr(start, length)наstr.substring(start, start + length). - Если
startможет быть отрицательным, вместо этого используйтеslice(start, start + length)—substringограничивает отрицательные значения до0. - Проверьте граничные случаи, где
lengthравно0, отрицательное или пропущено, потому чтоsubstrиsubstringведут себя по-разному на таких входах.
FAQ
В чем разница между JavaScript substring и slice?
Оба метода извлекают часть строки по индексам, но по-разному ведут себя на граничных случаях. substring ограничивает отрицательные аргументы до 0 и меняет местами start/end, когда start больше. slice трактует отрицательные значения как смещения от конца и возвращает пустую строку, если start больше end. Для обычного извлечения слева направо оба метода дают одинаковый результат.
Изменяет ли JavaScript substring исходную строку?
Нет. Строки в JavaScript неизменяемы, поэтому любой строковый метод возвращает новую строку. После вызова substring исходное значение остаётся прежним. Сохраняйте результат в переменную, если нужна извлечённая часть.
Что происходит, когда start больше end в substring?
substring молча меняет аргументы местами. "abcdef".substring(4, 1) работает так же, как "abcdef".substring(1, 4), и возвращает "bcd". Такая нормализация защищает от неожиданных пустых строк, когда вычисления дают границы в обратном порядке.