11

Метод endsWith в JavaScript

11

Как проверить, заканчивается ли строка на определенный символ в JavaScript?

У меня есть строка:

var str = "mystring#";

Я хочу узнать, заканчивается ли эта строка на #. Как я могу это проверить?

  1. Существует ли метод endsWith() в JavaScript?
  2. Один из решений, которое я нашел, — это получить длину строки и проверить последний символ.

Это лучший способ, или есть другой более эффективный способ?

5 ответ(ов)

3

Выражение /#$/.test(str) будет работать во всех браузерах, не требует патчинга String и не требует проверки всей строки, как это делает lastIndexOf, если совпадение не найдено.

Если вам нужно сопоставить фиксированную строку, которая может содержать специальные символы регулярных выражений, такие как '$', вы можете использовать следующую функцию:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

А затем вы сможете использовать её следующим образом:

makeSuffixRegExp("a[complicated]*suffix*").test(str)

Таким образом, вы сможете безопасно проверять наличие суффикса в строке без ненужных сложностей и ограничений.

0
  1. К сожалению, нет.

if ("mystring#".substr(-1) === "#")

0

Ваше решение для реализации метода endsWith выглядит вполне разумно. Давайте разберем его:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

В этом коде вы проверяете, что длина исходной строки больше или равна длине строки s. Если это так, то используете метод substr, чтобы извлечь подстроку из исходной строки, начиная с позиции, равной разности длины исходной строки и длины s. Затем сравниваете эту подстроку с s.

Однако есть некоторые нюансы, которые стоит учесть:

  1. Сравнение на строгую равенство (==): Рекомендуется использовать строгое равенство (===) вместо нестрогого (==), чтобы избежать возможных проблем с приведением типов.

  2. Оптимизация производительности: Вы сами заметили, что использование метода lastIndexOf может создать лишние циклы ЦП, если нет совпадений. Ваше решение делает ровно то, что требуется, и эффективно обрабатывает случаи, когда нет совпадений.

  3. Обработка пустых строк: Ваше решение также корректно обрабатывает ситуацию, когда строка s является пустой строкой. В таком случае endsWith должен возвращать true.

Теперь, если ваша реализация отвечает всем требованиям, то она вполне корректна. Вот немного улучшенная версия:

String.prototype.endsWith = function (s) {
  if (s.length === 0) return true; // Обработка пустой строки
  return this.length >= s.length && this.substr(this.length - s.length) === s;
}

Это более безопасный подход, который учитывает различные сценарии.

0

Эта версия avoids создание подстроки и не использует регулярные выражения (некоторые ответы с регулярными выражениями здесь будут работать, другие — нет):

String.prototype.endsWith = function(str) {
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

Если производительность для вас важна, стоит протестировать, действительно ли lastIndexOf быстрее, чем создание подстроки. (Это может зависеть от используемого вами движка JS...) Возможно, в случае совпадения и когда строка небольшая, это будет работать быстрее, но когда строка огромная, функция должна проверять всю строку, даже если это не имеет значения 😦

Для проверки одного символа, вероятно, лучше всего использовать charAt, предварительно определив длину строки.

0

Вы правы, вы упомянули подход с использованием метода slice, который действительно может быть эффективным для решения задачи. Вот ваш код с некоторыми пояснениями:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix;
}

В этой функции endsWith проверяется, заканчивается ли строка str на подстроку suffix. Метод slice с отрицательным индексом -suffix.length извлекает часть строки str, начиная с позиции, равной длине суффикса, и до конца строки. Затем это значение сравнивается с suffix.

Этот подход лаконичен и эффективно решает задачу. Так что спасибо, что поделились!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь