Метод endsWith в JavaScript
Как проверить, заканчивается ли строка на определенный символ в JavaScript?
У меня есть строка:
var str = "mystring#";
Я хочу узнать, заканчивается ли эта строка на #
. Как я могу это проверить?
- Существует ли метод
endsWith()
в JavaScript? - Один из решений, которое я нашел, — это получить длину строки и проверить последний символ.
Это лучший способ, или есть другой более эффективный способ?
5 ответ(ов)
Выражение /#$/.test(str)
будет работать во всех браузерах, не требует патчинга String
и не требует проверки всей строки, как это делает lastIndexOf
, если совпадение не найдено.
Если вам нужно сопоставить фиксированную строку, которая может содержать специальные символы регулярных выражений, такие как '$'
, вы можете использовать следующую функцию:
function makeSuffixRegExp(suffix, caseInsensitive) {
return new RegExp(
String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
caseInsensitive ? "i" : "");
}
А затем вы сможете использовать её следующим образом:
makeSuffixRegExp("a[complicated]*suffix*").test(str)
Таким образом, вы сможете безопасно проверять наличие суффикса в строке без ненужных сложностей и ограничений.
- К сожалению, нет.
-
if ("mystring#".substr(-1) === "#")
Ваше решение для реализации метода endsWith
выглядит вполне разумно. Давайте разберем его:
String.prototype.endsWith = function (s) {
return this.length >= s.length && this.substr(this.length - s.length) == s;
}
В этом коде вы проверяете, что длина исходной строки больше или равна длине строки s
. Если это так, то используете метод substr
, чтобы извлечь подстроку из исходной строки, начиная с позиции, равной разности длины исходной строки и длины s
. Затем сравниваете эту подстроку с s
.
Однако есть некоторые нюансы, которые стоит учесть:
Сравнение на строгую равенство (
==
): Рекомендуется использовать строгое равенство (===
) вместо нестрогого (==
), чтобы избежать возможных проблем с приведением типов.Оптимизация производительности: Вы сами заметили, что использование метода
lastIndexOf
может создать лишние циклы ЦП, если нет совпадений. Ваше решение делает ровно то, что требуется, и эффективно обрабатывает случаи, когда нет совпадений.Обработка пустых строк: Ваше решение также корректно обрабатывает ситуацию, когда строка
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;
}
Это более безопасный подход, который учитывает различные сценарии.
Эта версия avoids создание подстроки и не использует регулярные выражения (некоторые ответы с регулярными выражениями здесь будут работать, другие — нет):
String.prototype.endsWith = function(str) {
var lastIndex = this.lastIndexOf(str);
return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}
Если производительность для вас важна, стоит протестировать, действительно ли lastIndexOf
быстрее, чем создание подстроки. (Это может зависеть от используемого вами движка JS...) Возможно, в случае совпадения и когда строка небольшая, это будет работать быстрее, но когда строка огромная, функция должна проверять всю строку, даже если это не имеет значения 😦
Для проверки одного символа, вероятно, лучше всего использовать charAt
, предварительно определив длину строки.
Вы правы, вы упомянули подход с использованием метода slice
, который действительно может быть эффективным для решения задачи. Вот ваш код с некоторыми пояснениями:
function endsWith(str, suffix) {
return str.slice(-suffix.length) === suffix;
}
В этой функции endsWith
проверяется, заканчивается ли строка str
на подстроку suffix
. Метод slice
с отрицательным индексом -suffix.length
извлекает часть строки str
, начиная с позиции, равной длине суффикса, и до конца строки. Затем это значение сравнивается с suffix
.
Этот подход лаконичен и эффективно решает задачу. Так что спасибо, что поделились!
Как присвоить многострочную строку переменной?
Преобразование объекта JS в строку JSON
Преобразование объекта в строку
Как преобразовать строку, разделённую запятыми, в массив?
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?