IndexOf: примеры (JAVASCRIPT)

Работа с функцией indexOf для поиска элементов в JS
Раздел: Массивы, Поиск
indexOf(searchElement, fromIndex?): number

Метод indexOf() применяется к строкам и массивам в JavaScript для поиска первого вхождения указанного элемента или подстроки. Он возвращает индекс первого совпадения или -1, если совпадение не найдено.

Основные сведения

Для строк метод выполняет поиск подстроки, учитывая регистр. Для массивов - поиск элемента по строгому равенству (===).

Аргументы для строки:

  • searchValue: искомая подстрока.
  • fromIndex (необязательный): позиция, с которой начинается поиск (по умолчанию 0).

Аргументы для массива:

  • searchElement: искомый элемент.
  • fromIndex (необязательный): индекс начала поиска.

Возвращаемое значение:

  • Индекс первого вхождения (начиная с 0).
  • -1, если значение не найдено.

Примеры использования

Примеры со строками:

const str = "Я изучаю JavaScript";
console.log(str.indexOf("JavaScript"));
9
console.log(str.indexOf("я"));
console.log(str.indexOf("я", 3));
2
13

Примеры с массивами:

const arr = [10, 20, 30, 20, 40];
console.log(arr.indexOf(20));
console.log(arr.indexOf(20, 2));
1
3

Альтернативные методы в JavaScript

lastIndexOf(): ищет последнее вхождение, начиная с конца.

includes(): возвращает true/false, проверяет наличие подстроки или элемента (не поддерживает позицию старта для массивов).

findIndex() (для массивов): принимает функцию-предикат для сложных условий поиска.

search() (для строк): принимает регулярное выражение, но не поддерживает простой поиск с позиции.

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

Путаница с возвращаемым значением при ненаходке:

const result = "test".indexOf("x");
if (result) { // Неправильно, т.к. -1 == true
  console.log("Найдено");
}
Условие выполнится, хотя результат -1

Сравнение с -1:

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

Поиск объекта в массиве:

console.log([{id:1}].indexOf({id:1}));
-1 (разные объекты)

Изменения в спецификации

Метод indexOf для массивов добавлен в ECMAScript 5 (2009). В более ранних версиях его не существовало.

Строковый indexOf присутствует с первых версий JavaScript. Современные движки оптимизируют его работу, но поведение остается неизменным.

Расширенные примеры

Поиск всех вхождений:

Пример javascript
const str = "оОоо";
let pos = -1;
while ((pos = str.indexOf("о", pos + 1)) !== -1) {
  console.log(pos);
}
0
2
3

Использование с fromIndex больше длины строки:

Пример javascript
console.log("abc".indexOf("a", 10));
-1

Поиск в массиве с пропущенными элементами:

Пример javascript
console.log([,,,].indexOf(undefined));
-1 (пропущенные элементы не равны undefined)

Поиск NaN в массиве:

Пример javascript
console.log([NaN].indexOf(NaN));
-1 (NaN !== NaN)

Приведение аргумента fromIndex:

Пример javascript
console.log("abc".indexOf("a", "1"));
-1 (строка "1" приводится к числу 1)

Аналоги в других языках

PHP: strpos() для строк. Возвращает позицию или false.

echo strpos("Hello world", "world");
6

Python: find() для строк и index() для списков. index() вызывает ошибку при отсутствии.

print("hello".find("e"))
print([5,6,7].index(6))
1
1

MySQL: LOCATE() или INSTR() для строк.

SELECT LOCATE('bar', 'foobarbar');
4

C: strstr() возвращает указатель на первое вхождение.

JS indexOf function comments

En
IndexOf Returns the first index at which a given element can be found in the array/string