Além da legibilidade aprimorada, há alguma vantagem em includes
mais indexOf
? Eles parecem idênticos para mim.
Qual é a diferença entre isso
var x = [1,2,3].indexOf(1) > -1; //true
E isto?
var y = [1,2,3].includes(1); //true
javascript
ecmascript-7
Matt
fonte
fonte
includes
tem suporte de navegador muito pior.includes
não faz parte do ES6 / ES2015. É uma proposta para a próxima versão do ECMAScript e será adicionada este ano.includes
NÃO é suportado no IERespostas:
tl; dr:
NaN
é tratado de forma diferente:[NaN].indexOf(NaN) > -1
éfalse
[NaN].includes(NaN)
étrue
Da proposta :
Outras informações:
SameValueZero
algoritmoStrict Equality Comparison
algoritmofonte
undefined
por.includes()
e não são considerados por.indexOf()
.Se você está se perguntando sobre o desempenho, por enquanto, indexOf é mais rápido, mas esse teste JSperf tende a mostrar que quanto mais o tempo passa, mais
includes()
será mais rápido do queindexOf
(acho que será otimizado ainda mais).IMHO, também prefiro escrever,
if (arr.includes(el)) {}
pois é mais claro e mais fácil de manter do queif (arr.indexOf(el) !== -1) {}
fonte
.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 enquantoincludes
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
.undefined
.Uso em String
( Link para a Especificação ECMAScript)
indexOf
, ele tratará o RegExp como uma string e retornará o índice da string, se encontrado. No entanto, se você passar um RegExp paraincludes
, ele lançará uma exceção.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 enquantoArray.prototype.includes()
foi introduzido no ECMAScript 2016. Com relação ao suporte do navegador, use-os com sabedoria.String.prototype.indexOf()
eArray.prototype.indexOf()
estão presentes na edição ES5 do ECMAScript e, portanto, são suportados por todos os navegadores.fonte
indexOf
dátrue
depois de definir explicitamenteundefined
em uma matriz:let arr=[undefined];
oulet arr=[];arr[0]=undefined;
Agoraarr.indexOf(undefined) === 0
undefined
: O motivo é que.includes
trata os elementos ausentes comoundefined
, enquanto os.indexOf()
ignora. Você também pode “criar” elementos ausentes comarr[number beyond length] = whatever
..includes()
só come cordas. Na realidade, ambos os métodos coagem qualquer coisa a uma string tão boa quanto possível. Regex é especificamente excluído como argumento para.includes()
a permitir futuras adições para o padrão de acordo com o projecto actual.Conceitualmente, você deve usar indexOf quando quiser usar a posição indexOf, apenas para extrair o valor ou operar sobre o array, ou seja, usando slice, shift ou split após obter a posição do elemento. Por outro lado, Use Array.includes apenas para saber se o valor está dentro da matriz e não a posição, porque você não se importa com isso.
fonte
indexOf()
eincludes()
podem ser usados para localizar elementos em uma matriz, no entanto, cada função produz valores de retorno diferentes.indexOf
retorna um número (-1
se o elemento não estiver presente na matriz, ou a posição da matriz se o elemento estiver presente).includes()
retorna um valor booleano (true
oufalse
).fonte