.indexOf()
e os .includes()
métodos podem ser usados para pesquisar um elemento em uma matriz ou para pesquisar um caractere / substring em uma determinada string.
Uso em matriz
( Link para a Especificação ECMAScript)
indexOf
usa comparação de igualdade estrita enquanto includes
usa o algoritmo SameValueZero . Por esse motivo, surgem os dois pontos de diferenças a seguir.
Conforme apontado por Felix Kling , o comportamento é diferente no caso de NaN
.
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
- O comportamento também é diferente no caso de
undefined
.
let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
Uso em String
( Link para a Especificação ECMAScript)
- Se você passar um RegExp para
indexOf
, ele tratará o RegExp como uma string e retornará o índice da string, se encontrado. No entanto, se você passar um RegExp para includes
, ele lançará uma exceção.
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
atuação
Como 538ROMEO apontou, includes
pode ser um pouco (muito pequeno) um pouco mais lento (pois ele precisa verificar se há um regex como o primeiro argumento) do que, indexOf
mas na realidade, isso não faz muita diferença e é insignificante.
História
String.prototype.includes()
foi introduzido no ECMAScript 2015 enquanto Array.prototype.includes()
foi introduzido no ECMAScript 2016. Com relação ao suporte do navegador, use-os com sabedoria.
String.prototype.indexOf()
e Array.prototype.indexOf()
estão presentes na edição ES5 do ECMAScript e, portanto, são suportados por todos os navegadores.
includes
tem suporte de navegador muito pior.