Más allá de la legibilidad mejorada, ¿hay alguna ventaja para includes
over 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
includes
tiene un soporte de navegador mucho peor.includes
no forma parte de ES6 / ES2015. Es una propuesta para la próxima versión de ECMAScript y se agregará este año.includes
NO es compatible con IE en absolutoRespuestas:
tl; dr:
NaN
se trata de manera diferente:[NaN].indexOf(NaN) > -1
esfalse
[NaN].includes(NaN)
estrue
De la propuesta :
Más información:
SameValueZero
algoritmoStrict Equality Comparison
algoritmofuente
undefined
por.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)
indexOf
usa la comparación estricta de igualdad mientras queincludes
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 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ó ,
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 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
indexOf
datrue
después de establecer explícitamenteundefined
en una matriz:let arr=[undefined];
olet arr=[];arr[0]=undefined;
Ahoraarr.indexOf(undefined) === 0
undefined
: La razón es que.includes
trata 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.indexOf
devuelve un número-1
si 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 (true
ofalse
).fuente