.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)
indexOf
usa la comparación estricta de igualdad mientras que includes
usa 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ó , includes
puede 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.
includes
tiene un soporte de navegador mucho peor.