Learn JavaScript

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

indexOf() ищет значение в массиве и возвращает индекс первого совпадения.

Если значение не найдено, метод возвращает -1.

Синтаксис

array.indexOf(value)
array.indexOf(value, fromIndex)

value - значение, которое нужно найти.

fromIndex - позиция, с которой начинается поиск.

Что делает indexOf()

Метод проходит по массиву слева направо и ищет первое совпадение.

const numbers = [10, 20, 30];

console.log(numbers.indexOf(20)); // 1
console.log(numbers.indexOf(50)); // -1

Что возвращает indexOf()

indexOf() возвращает:

  • индекс первого найденного элемента
  • -1, если ничего не найдено
const fruits = ["apple", "banana", "orange"];

console.log(fruits.indexOf("banana")); // 1
console.log(fruits.indexOf("grape"));  // -1

Это главное, что нужно запомнить про метод.

Поиск с fromIndex

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

const numbers = [1, 2, 3, 2];

console.log(numbers.indexOf(2, 2)); // 3
console.log(numbers.indexOf(1, 2)); // -1

Здесь поиск начинается с индекса 2.

Отрицательный fromIndex

fromIndex может быть отрицательным.

В этом случае отсчёт идёт с конца массива, но поиск всё равно идёт слева направо от вычисленной позиции.

const numbers = [1, 2, 3, 4];

console.log(numbers.indexOf(3, -2)); // 2
console.log(numbers.indexOf(2, -2)); // -1

indexOf() и includes()

Эти методы часто используются для одной задачи, но возвращают разное.

const numbers = [10, 20, 30];

console.log(numbers.indexOf(20));  // 1
console.log(numbers.includes(20)); // true

indexOf() возвращает индекс.

includes() возвращает только true или false.

Если нужна просто проверка наличия, includes() обычно читается проще.

indexOf() и findIndex()

indexOf() ищет точное значение.

findIndex() ищет по условию.

const numbers = [10, 20, 30];

console.log(numbers.indexOf(20));                         // 1
console.log(numbers.findIndex((value) => value > 15));   // 1

Если нужно гибкое условие, обычно используют findIndex().

Объекты сравниваются по ссылке

Если в массиве лежат объекты, indexOf() сравнивает не содержимое, а ссылку.

const user = { id: 1 };
const users = [user];

console.log(users.indexOf(user));      // 0
console.log(users.indexOf({ id: 1 })); // -1

На вид объекты одинаковые, но это разные ссылки.

indexOf() не находит NaN

Это важный нюанс.

const values = [1, 2, NaN];

console.log(values.indexOf(NaN));  // -1
console.log(values.includes(NaN)); // true

Если нужно проверить наличие NaN, удобнее использовать includes().

indexOf() не меняет исходный массив

Метод только ищет элемент и не изменяет массив.

const numbers = [1, 2, 3];
const result = numbers.indexOf(2);

console.log(numbers); // [1, 2, 3]
console.log(result);  // 1

Пустые слоты

indexOf() пропускает пустые слоты массива.

const arr = Array(3);

console.log(arr.indexOf(undefined)); // -1

Это отличается от includes(), который в такой ситуации может вернуть true.

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

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

  • нужен индекс найденного элемента
  • нужно выполнить проверку вида !== -1
  • ищется точное примитивное значение

Пример:

const roles = ["user", "editor", "admin"];
const index = roles.indexOf("editor");

console.log(index); // 1

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

Думать, что indexOf() возвращает true или false

const numbers = [1, 2, 3];
const result = numbers.indexOf(2);

console.log(result); // 1

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

Писать проверку через if (indexOf(…))

const numbers = [10, 20, 30];

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

Это ошибка, потому что индекс 0 является falsy.

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

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

Сравнивать объекты по содержимому

const items = [{ id: 1 }];

console.log(items.indexOf({ id: 1 })); // -1

Для объектов сравнение идёт по ссылке.

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

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

Коротко

indexOf() - это стандартный способ найти индекс элемента в массиве. Главное, что стоит запомнить: метод возвращает число, а не true/false, и если совпадения нет, результатом будет -1.