.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
имеет гораздо худшую поддержку браузера.