Más allá de la legibilidad mejorada, ¿hay alguna ventaja para includesover indexOf? Me parecen idénticos.
Cual es la diferencia entre esto
var x = [1,2,3].indexOf(1) > -1; //true
¿Y esto?
var y = [1,2,3].includes(1); //true
javascript
ecmascript-7
Mate
fuente
fuente

includestiene un soporte de navegador mucho peor.includesno forma parte de ES6 / ES2015. Es una propuesta para la próxima versión de ECMAScript y se agregará este año.includesNO es compatible con IE en absolutoRespuestas:
tl; dr:
NaNse trata de manera diferente:[NaN].indexOf(NaN) > -1esfalse[NaN].includes(NaN)estrueDe la propuesta :
Más información:
SameValueZeroalgoritmoStrict Equality Comparisonalgoritmofuente
undefinedpor.includes()y no son considerados por.indexOf().Si te preguntas sobre el rendimiento, por el momento indexOf es más rápido, pero esta prueba JSperf tiende a mostrar que cuanto más pase el tiempo, más
includes()será más rápido queindexOf(supongo que se optimizará aún más).En mi humilde opinión, también prefiero escribir
if (arr.includes(el)) {}ya que es más claro y más fácil de mantener queif (arr.indexOf(el) !== -1) {}fuente
.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 queincludesusa 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 de
NaN.undefined.Uso en cadena
( Enlace a la especificación ECMAScript)
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.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) queindexOfpero en realidad, esto no hace mucha diferencia y es insignificante.Historia
String.prototype.includes()se introdujo en ECMAScript 2015 mientras queArray.prototype.includes()se introdujo en ECMAScript 2016. Con respecto a la compatibilidad con el navegador, utilícelos con prudencia.String.prototype.indexOf()yArray.prototype.indexOf()están presentes en la edición ES5 de ECMAScript y, por lo tanto, son compatibles con todos los navegadores.fuente
indexOfdatruedespués de establecer explícitamenteundefineden una matriz:let arr=[undefined];olet arr=[];arr[0]=undefined;Ahoraarr.indexOf(undefined) === 0undefined: La razón es que.includestrata los elementos faltantes comoundefined, mientras que los.indexOf()ignora. También puede "crear" elementos faltantes conarr[number beyond length] = whatever..includes()solo come cuerdas. En realidad, ambos métodos coaccionan cualquier cosa a una cuerda tan bien como pueden. Expresiones regulares se excluye específicamente como argumento para.includes()a permitir futuras ampliaciones de la norma de acuerdo con el proyecto actual.Conceptualmente, debes usar indexOf cuando quieras usar la posición indexOf, solo dale para extraer el valor u operar sobre la matriz, es decir, usando slice, shift o split después de obtener la posición del elemento. Por otro lado, Use Array.incluye solo para saber si el valor está dentro de la matriz y no la posición porque no le importa.
fuente
indexOf()yincludes()ambos se pueden usar para buscar elementos en una matriz, sin embargo, cada función produce valores de retorno diferentes.indexOfdevuelve un número-1si el elemento no está presente en la matriz, o la posición de la matriz si el elemento está presente).includes()devuelve un valor booleano (trueofalse).fuente