Avatar ·

Как проверить, содержит ли строка подстроку в JavaScript? (методы includes, indexOf, search)

Всем привет! Я новичок в JavaScript и столкнулся с такой задачей: нужно проверить, есть ли определённое слово или фраза внутри строки. Например, у меня есть переменная `let text = "Привет, мир! Сегодня отличная погода.";` и я хочу узнать, содержит ли эта строка слово "мир". Я перепробовал несколько подходов, но они не работают так, как я ожидал. Пробовал просто сравнение через `==` — но это сравнивает всю строку целиком, а не ищет подстроку. Потом нашёл метод `indexOf`, но он возвращает число, а не true/false, и я не уверен, как правильно его использовать для проверки. Вот пример моего кода, который не даёт нужного результата: ```javascript let text = "Привет, мир! Сегодня отличная погода."; let searchWord = "мир"; if (text == searchWord) { console.log("Строка содержит слово"); } else { console.log("Строка не содержит слово"); } ``` Этот код всегда выводит "не содержит", потому что сравнивает всю строку целиком. Как правильно проверить наличие подстроки? Какие методы для этого существуют в современном JavaScript? И есть ли разница между методами для латиницы и кириллицы? Буду благодарен за подробное объяснение с примерами! <<>>

Самый простой и современный способ: метод includes()

Начиная с ECMAScript 2015 (ES6), в JavaScript появился метод String.prototype.includes(), который идеально подходит для вашей задачи. Он возвращает true, если строка содержит указанную подстроку, и false в противном случае. Метод чувствителен к регистру.

let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";

if (text.includes(searchWord)) {
  console.log("Строка содержит слово");
} else {
  console.log("Строка не содержит слово");
}
// Вывод: "Строка содержит слово"

Метод includes() также принимает второй необязательный параметр — позицию, с которой начинать поиск:

let text = "Привет, мир! Мир прекрасен.";
console.log(text.includes("мир", 10)); // false — начиная с 10-й позиции "мир" не найден
console.log(text.includes("мир", 0));  // true — поиск с начала строки

Классический способ: метод indexOf()

Этот метод существует с первых версий JavaScript. Он возвращает индекс первого вхождения подстроки или -1, если подстрока не найдена. Для проверки наличия подстроки используйте сравнение с -1:

let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";

if (text.indexOf(searchWord) !== -1) {
  console.log("Строка содержит слово");
} else {
  console.log("Строка не содержит слово");
}
// Вывод: "Строка содержит слово"

indexOf() тоже принимает второй параметр — начальную позицию поиска. Этот метод полезен, когда вам нужно не просто проверить наличие, но и узнать точную позицию подстроки.

Регулярные выражения: метод search() и test()

Если вам нужна более гибкая проверка (например, без учёта регистра или с использованием шаблонов), используйте регулярные выражения:

let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";

// Метод search() возвращает индекс или -1
if (text.search(/мир/) !== -1) {
  console.log("Найдено");
}

// Метод test() возвращает true/false
if (/мир/.test(text)) {
  console.log("Найдено");
}

// Поиск без учёта регистра (флаг i)
if (/МИР/i.test(text)) {
  console.log("Найдено без учёта регистра");
}

Важные моменты и рекомендации

  • Чувствительность к регистру: Все три метода (includes, indexOf, search) чувствительны к регистру. Для поиска без учёта регистра используйте регулярные выражения с флагом i или предварительно приводите обе строки к одному регистру: text.toLowerCase().includes(searchWord.toLowerCase()).
  • Работа с кириллицей: Все методы корректно работают с кириллицей и другими Unicode-символами. Никаких дополнительных настроек не требуется.
  • Производительность: Для простых проверок includes() — самый читаемый и быстрый вариант. indexOf() часто используется в старом коде. Регулярные выражения немного медленнее, но предоставляют больше возможностей.
  • Совместимость: includes() поддерживается во всех современных браузерах и средах (Node.js 6+). Если вам нужно поддерживать очень старые браузеры (например, Internet Explorer), используйте indexOf().

Для вашей задачи рекомендую использовать includes() — это самый простой и наглядный способ. Если же вам нужно узнать позицию подстроки или вы работаете с устаревшим кодом, используйте indexOf().

<<>>

Альтернативный подход: метод match() и оператор in

Помимо основных методов, существуют и другие способы проверки наличия подстроки, которые могут быть полезны в специфических ситуациях.

Метод match() с регулярным выражением

Этот метод возвращает массив совпадений или null, если ничего не найдено. Можно использовать для проверки:

let text = "Привет, мир! Сегодня отличная погода.";
let result = text.match(/мир/);
if (result) {
  console.log("Слово найдено: " + result[0]); // Вывод: "Слово найдено: мир"
} else {
  console.log("Не найдено");
}

Метод match() особенно удобен, когда нужно получить все вхождения подстроки или извлечь часть строки по шаблону.

Использование оператора in (не подходит для строк!)

Важно: оператор in работает только с объектами и массивами, но не со строками. Начинающие разработчики иногда пытаются сделать так:

let text = "Привет, мир!";
if ("мир" in text) { // Ошибка! Неправильное использование
  console.log("Найдено");
}

Этот код не будет работать корректно, так как in проверяет наличие ключа/свойства в объекте, а не подстроки. Для строк используйте только методы, описанные выше.

Совет по написанию универсальной функции

Если вы часто проверяете наличие подстрок, создайте небольшую утилиту:

function containsSubstring(str, substr, caseSensitive = true) {
  if (!caseSensitive) {
    return str.toLowerCase().includes(substr.toLowerCase());
  }
  return str.includes(substr);
}

console.log(containsSubstring("Привет, Мир!", "мир", false)); // true
console.log(containsSubstring("Привет, Мир!", "мир", true));  // false

Выбирайте метод в зависимости от задачи: для простой проверки — includes(), для позиции — indexOf(), для гибкого поиска — регулярные выражения.