Для примера возмём адрес
https://learn.javascript.ru/json
В данном случае
location.href вернёт строку.
console.log(window.location.href.indexOf('json'));
// получим цифру 28
Метод
indexOf() ищет в массиве или строке совпадение и возвращает цифру ( начиная с нуля, количество символов до искомого значения), т.е. вернётся индекс первого найденного элемента или -1, если ничего не нашлось.
Искомый "
json" начинается с 29 буквы, но учитывая что отчёт начинается с 0, поэтому 28 буква.
'Hello, world!'.indexOf('world'); // 7
'Hello, world!'.indexOf('o'); // 4, в конце hello
'Hello, world!'.indexOf('o', 5); // 8, вторая буква в world
!!'Hello, world!'.indexOf('z'); // true, отрицательное число приводится к true
!!'Hello, world!'.indexOf('H'); // false, 0 трактуется как false
Это древний метод
indexOf(), для таких задач лучше использовать метод i
ncludes() .
Раньше методом
indexOf() часто проверяли, есть ли элемент в массиве. Эта задача проще, индекс здесь не нужен, но других методов для этого не было.
Поэтому в старых скриптах можно увидеть такой код:
const guestList = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя', 'Эммануил']
const guest = // получаем откуда-нибудь имя гостя
if (guestList.indexOf(guest) >= 0) {
// пускаем на вечеринку
} else {
// отправляем домой
}
Из-за того, что
indexOf() возвращает индекс, в условии обязательно нужна проверка (>= 0 или !== -1).
Если так
не сделать, то появится
неприятный баг: мы будем пускать на вечеринку всех, кроме первого гостя в списке.
Дело в том, что JavaScript интерпретирует ненулевые числа как истину (true) и будет запускать первую ветку if.
А на первом госте
indexOf() вернёт 0, что считается ложным (false), и наш скрипт не пустит человека на вечеринку.
Метод
lastIndexOf() начинает поиск с конца.
Метод
test() тоже хорош, просто проверит, подходит ли искомая строка под регулярное выражение.
Отличие метода
includes()(добавлен в ECMAScript в 2016г) от метода
indexOf() заключается в том, что он возвращает логическое значение (true, или false), а не числовое значение (индекс элемента, или -1, если элемент не найден).
Кроме того, очень незначительным отличием
includes() является то, что он правильно обрабатывает
NaN в отличие от
indexOf/lastIndexOf.
Я предпочитаю так:
if (window.location.href.includes('json')) {
// содержит
} else {
// не содержит
}