IndexOf: примеры (JAVASCRIPT)
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. Современные движки оптимизируют его работу, но поведение остается неизменным.
Расширенные примеры
Поиск всех вхождений:
const str = "оОоо";
let pos = -1;
while ((pos = str.indexOf("о", pos + 1)) !== -1) {
console.log(pos);
}0 2 3
Использование с fromIndex больше длины строки:
console.log("abc".indexOf("a", 10));-1
Поиск в массиве с пропущенными элементами:
console.log([,,,].indexOf(undefined));-1 (пропущенные элементы не равны undefined)
Поиск NaN в массиве:
console.log([NaN].indexOf(NaN));-1 (NaN !== NaN)
Приведение аргумента fromIndex:
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() возвращает указатель на первое вхождение.