.indexOf()и .includes()методы могут использоваться для поиска элемента в массиве или для поиска символа / подстроки в заданной строке.
Использование в массиве
( Ссылка на спецификацию ECMAScript)
indexOfиспользует строгое сравнение равенства, тогда как includesиспользует алгоритм SameValueZero . По этой причине возникают следующие два момента различий.
Как указал Феликс Клинг , в случае NaN.
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
- Поведение также отличается в случае
undefined.
let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
Использование в строке
( Ссылка на спецификацию ECMAScript)
- Если вы передадите RegExp в
indexOf, он будет рассматривать RegExp как строку и вернет индекс строки, если он найден. Однако, если вы передадите RegExp в includes, он выдаст исключение.
let str = "javascript";
str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression
Производительность
Как указал 538ROMEO , это includesможет быть немного (очень крошечное) немного медленнее (поскольку ему нужно проверять регулярное выражение в качестве первого аргумента), чем, indexOfно на самом деле это не имеет большого значения и незначительно.
История
String.prototype.includes()был представлен в ECMAScript 2015, тогда как Array.prototype.includes()был представлен в ECMAScript 2016. Что касается поддержки браузеров, используйте их с умом.
String.prototype.indexOf()и Array.prototype.indexOf()присутствуют в версии ECMAScript для ES5 и, следовательно, поддерживаются всеми браузерами.
includesимеет гораздо худшую поддержку браузера.