Другое

Как проверить конец строки в JavaScript

Узнайте несколько способов проверки, заканчивается ли строка определенным символом в JavaScript. Сравните методы endsWith(), slice(), charAt() и другие подходы с примерами кода и оценкой производительности.

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

Пример: у меня есть строка

var str = "mystring#";

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

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

Является ли это лучшим способом или есть другие варианты?

Метод endsWith() — это самый простой способ проверить, заканчивается ли строка определенным символом в JavaScript. Для вашего примера var str = "mystring#"; можно использовать str.endsWith("#"), который возвращает true, если строка заканчивается на #, и false в противном случае. Этот метод был введен в ES2015 и является рекомендуемым подходом для современного JavaScript-разработки.


Содержание


Использование метода endsWith()

Метод endsWith() — это встроенный метод строк в JavaScript, который определяет, заканчивается ли строка символами указанной строки. Этот метод чувствителен к регистру и возвращает логическое значение.

Базовый синтаксис

javascript
str.endsWith(searchString[, length])
  • searchString: Символы, которые нужно найти в конце строки
  • length (необязательный): Позиция, на которой нужно завершить поиск (по умолчанию str.length)

Примеры для вашего случая использования

javascript
var str = "mystring#";

// Проверяем, заканчивается ли строка на '#'
console.log(str.endsWith("#")); // true

// Проверяем, заканчивается ли строка определенными символами
console.log(str.endsWith("g#")); // true
console.log(str.endsWith("ing#")); // true
console.log(str.endsWith("mystring")); // false

Работа с разными регистрами

Поскольку endsWith() чувствителен к регистру, вам нужно вручную обрабатывать сравнения без учета регистра:

javascript
var str = "MyString#";

// Сравнение с учетом регистра
console.log(str.endsWith("#")); // true
console.log(str.endsWith("#")); // true

// Сравнение без учета регистра
console.log(str.toLowerCase().endsWith("#".toLowerCase())); // true

Совместимость с браузерами и полифилы

Метод endsWith() был введен в ES2015/ES6, что означает, что он может быть недоступен в старых браузерах, таких как Internet Explorer или более старых версиях Safari и браузеров Android.

Проверка поддержки

javascript
if (!String.prototype.endsWith) {
    console.log('Метод endsWith() не поддерживается в этом браузере');
}

Добавление полифила

Для более широкой поддержки браузеров вы можете добавить полифил в свой код:

javascript
// Если String.prototype.endswith не определен, добавляем его
if (!String.prototype.endsWith) {
    String.prototype.endsWith = function(search, this_len) {
        if (this_len === undefined || this_len > this.length) {
            this_len = this.length;
        }
        return this.substring(this_len - search.length, this_len) === search;
    };
}

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

Альтернативные методы для проверки одного символа

Хотя endsWith() является идеальным выбором, существует несколько альтернативных методов, которые можно использовать для проверки, заканчивается ли строка определенным символом, особенно если вам нужна более широкая совместимость с браузерами.

1. Использование метода charAt()

javascript
var str = "mystring#";

// Получаем последний символ и сравниваем
console.log(str.charAt(str.length - 1) === "#"); // true

2. Использование метода substring()

javascript
var str = "mystring#";

// Получаем последний символ с помощью substring
console.log(str.substring(str.length - 1) === "#"); // true

// Или для нескольких символов
console.log(str.substring(str.length - 1) === "#"); // true

3. Использование метода slice()

javascript
var str = "mystring#";

// Получаем последний символ с помощью slice
console.log(str.slice(-1) === "#"); // true

// Получаем последние N символов
console.log(str.slice(-2) === "g#"); // true

4. Использование метода lastIndexOf()

javascript
var str = "mystring#";

// Проверяем, находится ли последнее вхождение в конце
console.log(str.lastIndexOf("#") === str.length - 1); // true

5. Использование регулярных выражений

javascript
var str = "mystring#";

// Проверяем, заканчивается ли строка на '#'
console.log(/#$/.test(str)); // true

// Проверяем, заканчивается ли строка определенными символами
console.log(/g#$/.test(str)); // true

Сравнение методов для проверки одного символа

Метод Синтаксис Плюсы Минусы
endsWith() str.endsWith("#") Наиболее читаемый, ясный намерение Не поддерживается в очень старых браузерах
charAt() str.charAt(str.length - 1) === "#" Хорошая поддержка браузерами Более многословный
substring() str.substring(str.length - 1) === "#" Хорошая поддержка браузерами Более многословный
slice() str.slice(-1) === "#" Хорошая поддержка браузерами, отрицательная индексация Немного менее читабельно для начинающих
lastIndexOf() str.lastIndexOf("#") === str.length - 1 Хорошая поддержка браузерами Более сложная логика
RegExp /#$/.test(str) Гибкое сопоставление с образцом Избыточность для простых проверок

Сравнение производительности

Согласно результатам тестирования производительности из исследований, разные подходы показывают различные характеристики производительности:

Рейтинг производительности (от самого быстрого к самому медленному)

  1. Метод slice(-1) — Обычно показывает хорошую производительность для проверки одного символа
  2. Метод substring() — Хорошая производительность, особенно для одного символа
  3. Метод charAt() — Стабильная производительность в разных браузерах
  4. Метод lastIndexOf() — Немного медленнее из-за вычисления индекса
  5. Метод endsWith() — Оптимизирован в современных JavaScript-движках
  6. Регулярные выражения — Могут быть медленнее для простых проверок символов

Практические соображения по производительности

Для большинства практических приложений различия в производительности между этими методами незначительны, если вы не выполняете миллионы операций. Читаемость и поддерживаемость вашего кода должны быть вашими основными соображениями.

Вот простой тест производительности, который вы можете запустить:

javascript
var str = "mystring#";
var iterations = 1000000;

// Тест производительности endsWith
var start = performance.now();
for (var i = 0; i < iterations; i++) {
    str.endsWith("#");
}
var end = performance.now();
console.log('endsWith:', end - start + 'ms');

// Тест производительности slice
start = performance.now();
for (var i = 0; i < iterations; i++) {
    str.slice(-1) === "#";
}
end = performance.now();
console.log('slice:', end - start + 'ms');

Лучшие практики и рекомендации

Когда использовать endsWith()

  1. Современные веб-приложения: Если вы ориентируетесь на современные браузеры или можете использовать инструменты трансляции, такие как Babel, endsWith() является лучшим выбором благодаря своей читаемости.
  2. Командные проекты: При работе в командах endsWith() четко выражает намерение.
  3. Читаемость кода: Само название метода делает код самодокументированным.

Когда использовать альтернативы

  1. Поддержка старых браузеров: Если вам нужно поддерживать старые браузеры, такие как IE11, рассмотрите возможность использования альтернатив или добавления полифила.
  2. Проверка одного символа: Для проверки только последнего символа slice(-1) или charAt() могут быть более прямыми.
  3. Критически важный код по производительности: В приложениях, где производительность критична, тестируйте разные подходы для вашего конкретного случая использования.

Рекомендуемая стратегия реализации

javascript
// Проверяем, поддерживается ли endsWith, если нет, добавляем полифил
if (!String.prototype.endsWith) {
    String.prototype.endsWith = function(search, this_len) {
        if (this_len === undefined || this_len > this.length) {
            this_len = this.length;
        }
        return this.substring(this_len - search.length, this_len) === search;
    };
}

// Теперь вы можете безопасно использовать endsWith() во всех средах
function endsWithCharacter(str, char) {
    return str.endsWith(char);
}

// Примеры использования
var str = "mystring#";
console.log(endsWithCharacter(str, "#")); // true
console.log(endsWithCharacter(str, "!")); // false

Крайние случаи, которые следует учитывать

  1. Пустые строки:

    javascript
    "".endsWith("#"); // false
    "".endsWith(""); // true
    
  2. Строка поиска длиннее целевой:

    javascript
    "a".endsWith("ab"); // false (не вызывает ошибку)
    
  3. Специальные символы:

    javascript
    "string with spaces ".endsWith(" "); // true
    "path/to/file".endsWith("/"); // true
    
  4. Символы Unicode:

    javascript
    "café".endsWith("é"); // true
    "👨‍👩‍👧‍👦".endsWith("👦"); // false (сложный эмодзи)
    

Практический пример: Валидация расширения файла

javascript
function validateFileExtension(filename, extensions) {
    // Преобразуем массив расширений в нижний регистр для сравнения без учета регистра
    var lowerExtensions = extensions.map(ext => ext.toLowerCase());
    
    // Получаем расширение файла из имени файла
    var extension = filename.toLowerCase().slice(filename.lastIndexOf('.'));
    
    return lowerExtensions.includes(extension);
}

// Использование
var filename = "document.pdf";
console.log(validateFileExtension(filename, ['.pdf', '.doc', '.txt'])); // true
console.log(validateFileExtension(filename, ['.jpg', '.png'])); // false

Заключение

  1. Используйте endsWith() для современного JavaScript-разработки — это наиболее читаемый и поддерживаемый способ проверки, заканчивается ли строка определенными символами.

  2. Учитывайте совместимость с браузерами — если вам нужно поддерживать старые браузеры, используйте полифил или выбирайте альтернативные методы, такие как slice(-1) или charAt().

  3. Для проверки одного символа несколько подходов работают хорошо — slice(-1), charAt(str.length - 1) и substring(str.length - 1) обеспечивают хорошую производительность и поддержку браузерами.

  4. Различия в производительности обычно незначительны — если вы не обрабатываете миллионы строк, выбирайте метод, который делает ваш код наиболее читаемым и поддерживаемым.

  5. Правильно обрабатывайте крайние случаи — учитывайте пустые строки, специальные символы и Unicode при реализации функций сравнения строк в ваших приложениях.

Метод endsWith() остается предпочтительным выбором для большинства JavaScript-приложений, когда позволяет совместимость с браузерами, предлагая лучший баланс читаемости, производительности и выразительности.


Источники

  1. String.prototype.endsWith() - JavaScript | MDN
  2. string - endsWith in JavaScript - Stack Overflow
  3. JavaScript String endsWith() Method - W3Schools
  4. JavaScript String endsWith() Method - GeeksforGeeks
  5. JavaScript String endsWith() Method - Scaler Topics
  6. Two ways to confirm the ending of a String in JavaScript - freeCodeCamp
  7. JavaScript: String endsWith() method - TechOnTheNet
  8. JavaScript String endsWith() Method - Vultr Docs
  9. JavaScript endsWith function not working - Stack Overflow
  10. How to check if a string ends with another string in JavaScript - CoreUI
  11. Top Methods to Check If a String Ends With a Specific Character in JavaScript - SQLPeY
  12. JavaScript String endsWith() Method - JavaScript Tutorial
  13. String.prototype.substring() - JavaScript | MDN
  14. JavaScript endsWith: The Superhero Method Transforming String Manipulation - NHOSI
Авторы
Проверено модерацией
Модерация