Полное руководство по JavaScript substr() vs substring()
Узнайте ключевые различия между методами substr() и substring() в JavaScript, включая интерпретацию параметров, обработку отрицательных индексов и когда использовать каждый метод.
В чём различие между методами substr() и substring() в JavaScript?
Оба этих метода, кажется, дают одинаковый результат при использовании с одинаковыми параметрами:
alert("abc".substr(0,2)); // Выводит "ab"
alert("abc".substring(0,2)); // Также выводит "ab"
Каковы ключевые различия между этими двумя строковыми методами в JavaScript, и когда следует использовать каждый из них?
Основное различие между методами JavaScript substr() и substring() заключается в том, как они интерпретируют второй параметр: substr() использует параметр длины (количество символов для извлечения), а substring() использует конечный индекс (позицию, на которой нужно остановиться, исключая этот символ). Хотя часто результаты их работы похожи, их обработка отрицательных индексов, граничных случаев и перестановки аргументов создает важные поведенческие различия, которые разработчикам следует понимать.
- Каковы основные различия?
- Как они обрабатывают отрицательные индексы?
- Граничные случаи и особое поведение
- Когда следует использовать каждый метод?
- Примеры кода и практическое применение
- Совместимость с браузерами и статус устаревания
Каковы основные различия?
Фундаментальное различие между substr() и substring() заключается в интерпретации параметров и их поведении:
substr(start, length): Извлекает символы, начиная с позицииstart, и возвращаетlengthколичество символовsubstring(start, end): Извлекает символы с позицииstartдо (но не включая) позицииend
Как объясняется на Mozilla Developer Network, "Если indexStart больше, чем indexEnd, то эффект от substring() такой, как будто два аргумента были переставлены".
Это означает:
"abc".substr(1, 2)возвращает"bc"(начать с позиции 1, извлечь 2 символа)"abc".substring(1, 2)возвращает"b"(начать с позиции 1, остановиться перед позицией 2)
Сообщество Stack Overflow прекрасно это проясняет: “Второй аргумент для substring - это индекс, на котором нужно остановиться (но не включая его), а второй аргумент для substr - это максимальная длина для возврата.”
Как они обрабатывают отрицательные индексы?
Одним из самых значительных различий является то, как эти методы обрабатывают отрицательные индексы:
substr() с отрицательными индексами
substr() принимает отрицательные начальные индексы, которые отсчитываются с конца строки:
const text = "JavaScript";
console.log(text.substr(-3)); // "ipt" (последние 3 символа)
console.log(text.substr(-5, 3)); // "Scr" (5-й с конца, извлечь 3 символа)
Согласно Stack Overflow, “Если start отрицательный и abs(start) больше длины строки, substr использует 0 в качестве начального индекса”.
substring() с отрицательными индексами
substring() обрабатывает отрицательные индексы как 0:
const text = "Hello World";
console.log(text.substring(-3)); // "Hello World" (обрабатывается как substring(0))
console.log(text.substring(-3, 5)); // "Hello" (обрабатывается как substring(0, 5))
Как указано на GeeksforGeeks, “он преобразует отрицательные значения в 0, что означает, что метод начинается с начала строки”.
Граничные случаи и особое поведение
Несколько граничных случаев демонстрируют важные различия между этими методами:
Поведение при перестановке аргументов
-
substring()автоматически переставляет аргументы, когда start > end:javascriptconsole.log("abc".substring(2, 0)); // "ab" (обрабатывается как substring(0, 2)) -
substr()не переставляет аргументы:javascriptconsole.log("abc".substr(2, 0)); // "" (пустая строка)
Обработка отрицательной длины
Документация MDN показывает, что “Отрицательные длины в substr() обрабатываются как ноль”.
Пример граничного случая
Рассмотрим этот пример из MDN:
const str = "01234";
console.log(str.substr(1, -2)); // "" (отрицательная длина обрабатывается как 0)
console.log(str.substring(1, -2)); // "0" (обрабатывается как substring(0, 1))
console.log(str.slice(1, -2)); // "1" (отрицательный индекс с конца)
Это демонстрирует, как все три метода ведут себя по-разному в граничных случаях.
Когда следует использовать каждый метод?
Используйте substring(), когда:
- Вам нужно указать начальную и конечную позиции
- Вам требуется последовательное поведение во всех средах JavaScript
- Вы работаете с индексами, которые могут быть в неправильном порядке
- Вы хотите следовать современным рекомендациям по JavaScript
Используйте substr(), когда:
- Вам нужно извлечь определенное количество символов из начальной позиции
- Вы хотите использовать отрицательные индексы для отсчета с конца строки
- Вы поддерживаете устаревший код, который использует
substr()
Рассмотрите slice() вместо этого:
Согласно Refine, “В случаях, когда мне нужен отрицательный индекс, я использую slice()”. Метод slice() имеет более последовательное поведение с отрицательными индексами и обычно предпочтительнее в современном JavaScript.
Примеры кода и практическое применение
Сравнение базового использования
const text = "Alligator";
// Извлечение последних 3 символов
console.log(text.substr(-3)); // "tor"
console.log(text.substring(5)); // "tor"
// Извлечение средней части
console.log(text.substr(2, 3)); // "lig"
console.log(text.substring(2, 5)); // "lig"
// Попытка извлечения в обратном порядке
console.log(text.substr(5, 2)); // "to"
console.log(text.substring(5, 2)); // "" (переставлено в substring(2, 5) -> "lig")
Практические примеры
Извлечение расширения файла:
const filename = "document.pdf";
console.log(filename.substr(filename.lastIndexOf(".") + 1)); // "pdf"
console.log(filename.substring(filename.lastIndexOf(".") + 1)); // "pdf"
Получение первого слова из предложения:
const sentence = "Hello World";
console.log(sentence.substr(0, sentence.indexOf(" "))); // "Hello"
console.log(sentence.substring(0, sentence.indexOf(" "))); // "Hello"
Совместимость с браузерами и статус устаревания
Документация MDN прямо указывает, что substr() считается *“устаревшей функцией”`. Хотя она все еще поддерживается во всех браузерах, ее не рекомендуется использовать в новом коде.
Как отмечено на Mastering JS, substr() также “распространена, но считается ‘устаревшей функцией’ в документации Mozilla”.
Заключение
Выбор между substr() и substring() зависит от ваших конкретных потребностей и стандартов кодирования. Ключевые выводы:
- Интерпретация параметров:
substr()использует длину,substring()использует конечный индекс - Отрицательные индексы:
substr()их поддерживает,substring()преобразует в 0 - Перестановка аргументов:
substring()переставляет, когда start > end,substr()- нет - Современные предпочтения:
substring()предпочтительнее для нового кода,slice()для отрицательных индексов - Статус устаревания:
substr()считается устаревшей, несмотря на продолжающуюся поддержку
В большинстве случаев substring() обеспечивает более предсказуемое поведение и соответствует современным соглашениям JavaScript. Однако, когда вам specifically нужно отсчитывать с конца строки или извлечь фиксированное количество символов, substr() может быть полезен. Всегда учитывайте slice() как альтернативу, когда требуется отрицательная индексация.
Источники
- Difference between substr() and substring() in JavaScript - GeeksforGeeks
- Substring vs Substr vs Slice in JavaScript - Mastering JS
- substring vs substr in JavaScript - DigitalOcean
- String.prototype.substring() - JavaScript | MDN
- javascript - What is the difference between substr and substring? - Stack Overflow
- What is the Difference Between Substr and Substring - W3Docs
- String.prototype.substr() - JavaScript | MDN
- Difference Between substr() and substring() in JavaScript - StackAbuse
- Substr vs Substring in JavaScript - SkillForge
- Difference between the substr() and substring() in JavaScript? - Net-Informations