.indexOf()y los .includes()métodos se pueden usar para buscar un elemento en una matriz o para buscar un carácter / subcadena en una cadena dada.
Uso en matriz
( Enlace a la especificación ECMAScript)
indexOfusa la comparación estricta de igualdad mientras que includesusa el algoritmo SameValueZero . Por esta razón, surgen los siguientes dos puntos de diferencias.
Como señala Felix Kling , el comportamiento es diferente en caso deNaN .
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
- El comportamiento también es diferente en el caso de
undefined.
let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
Uso en cadena
( Enlace a la especificación ECMAScript)
- Si pasa una RegExp a
indexOf, tratará la RegExp como una cadena y devolverá el índice de la cadena, si se encuentra. Sin embargo, si pasa una expresión regular aincludes , generará una excepción.
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
Actuación
Como 538ROMEO señaló , includespuede ser un poco (muy pequeño) un poco más lento (ya que necesita verificar una expresión regular como primer argumento) queindexOf pero en realidad, esto no hace mucha diferencia y es insignificante.
Historia
String.prototype.includes() se introdujo en ECMAScript 2015 mientras que Array.prototype.includes() se introdujo en ECMAScript 2016. Con respecto a la compatibilidad con el navegador, utilícelos con prudencia.
String.prototype.indexOf()y Array.prototype.indexOf()están presentes en la edición ES5 de ECMAScript y, por lo tanto, son compatibles con todos los navegadores.
includestiene un soporte de navegador mucho peor.