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.