Learn JavaScript

indexOf() - метод для поиска подстроки в строке в JavaScript

indexOf() ищет подстроку в строке и возвращает индекс её первого вхождения.

Если подстрока не найдена, метод вернёт -1.

Синтаксис

str.indexOf(searchString)
str.indexOf(searchString, position)

Метод вызывается у строки и возвращает число.

Как работает indexOf()

const text = "JavaScript";

console.log(text.indexOf("Script")); // 4
console.log(text.indexOf("Java"));   // 0
console.log(text.indexOf("Python")); // -1

Метод возвращает индекс первого совпадения, а не true или false.

Позиция начала поиска

Во втором аргументе можно указать, с какого индекса начинать поиск.

const text = "banana";

console.log(text.indexOf("a"));    // 1
console.log(text.indexOf("a", 2)); // 3
console.log(text.indexOf("a", 4)); // 5

Это полезно, если нужно искать дальше по строке после первого совпадения.

Если подстрока не найдена

Если совпадения нет, indexOf() вернёт -1.

const text = "JavaScript";

console.log(text.indexOf("TypeScript")); // -1

Именно поэтому раньше часто писали проверки в таком виде:

const text = "JavaScript";

console.log(text.indexOf("Script") !== -1); // true

Регистр важен

indexOf() чувствителен к регистру.

const text = "JavaScript";

console.log(text.indexOf("java")); // -1
console.log(text.indexOf("Java")); // 0

Если нужен поиск без учёта регистра, строку обычно заранее приводят к одному формату.

const text = "JavaScript";

console.log(text.toLowerCase().indexOf("java")); // 0

Когда это полезно

indexOf() удобно использовать, когда:

  • нужно узнать позицию подстроки
  • важно получить именно индекс, а не true или false
  • нужно найти первое вхождение в строке

Пример:

const email = "user@gmail.com";

console.log(email.indexOf("@")); // 4

indexOf() и includes()

includes() отвечает только на вопрос “есть или нет”, а indexOf() возвращает позицию.

const text = "JavaScript";

console.log(text.includes("Script")); // true
console.log(text.indexOf("Script"));  // 4

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

Если подстрока пустая

Пустая строка считается найденной.

const text = "hello";

console.log(text.indexOf(""));   // 0
console.log(text.indexOf("", 2)); // 2

Частые ошибки

Проверять результат как boolean

Такой код может работать неправильно:

const text = "JavaScript";

if (text.indexOf("Java")) {
  console.log("Найдено");
}

Проблема в том, что indexOf("Java") вернёт 0, а 0 в условии - это falsy.

Правильно так:

const text = "JavaScript";

if (text.indexOf("Java") !== -1) {
  console.log("Найдено");
}

Или проще:

console.log(text.includes("Java")); // true

Забывать про регистр

const text = "JavaScript";

console.log(text.indexOf("javascript")); // -1

Если нужен поиск без учёта регистра, лучше заранее использовать toLowerCase() или toUpperCase().

Быстрая памятка

  • indexOf(searchString) возвращает индекс первого вхождения
  • если подстрока не найдена, метод вернёт -1
  • можно указать позицию начала поиска
  • поиск чувствителен к регистру
  • если нужна только проверка наличия, includes() обычно читается проще

Коротко

indexOf() - это метод строки в JavaScript, который ищет подстроку и возвращает индекс её первого вхождения. Он полезен, когда нужно не просто проверить наличие текста, а узнать его точную позицию в строке.