Au-delà de la lisibilité améliorée, y a-t-il un avantage à includes
sur indexOf
? Ils me semblent identiques.
Quelle est la différence entre ceci
var x = [1,2,3].indexOf(1) > -1; //true
Et ça?
var y = [1,2,3].includes(1); //true
Au-delà de la lisibilité améliorée, y a-t-il un avantage à includes
sur indexOf
? Ils me semblent identiques.
Quelle est la différence entre ceci
var x = [1,2,3].indexOf(1) > -1; //true
Et ça?
var y = [1,2,3].includes(1); //true
includes
a un support de navigateur bien pire.includes
ne fait pas partie de ES6 / ES2015. Il s'agit d'une proposition pour la prochaine version d'ECMAScript et sera ajoutée cette année.includes
Réponses:
tl; dr:
NaN
est traité différemment:[NaN].indexOf(NaN) > -1
estfalse
[NaN].includes(NaN)
esttrue
De la proposition :
Informations complémentaires:
SameValueZero
algorithmeStrict Equality Comparison
algorithmela source
undefined
par.includes()
et ne sont pas considérés par.indexOf()
.Si vous vous interrogez sur les performances, pour le moment, indexOf est plus rapide, mais ce test JSperf a tendance à montrer que plus le temps passe, plus
includes()
sera plus rapide queindexOf
(je suppose que ce sera encore optimisé).IMHO, je préfère aussi écrire
if (arr.includes(el)) {}
car il est plus clair et plus maintenable queif (arr.indexOf(el) !== -1) {}
la source
.indexOf()
et.includes()
méthodes peuvent être utilisées pour rechercher un élément dans un tableau ou pour rechercher un caractère / sous-chaîne dans une chaîne donnée.Utilisation dans la baie
( Lien vers la spécification ECMAScript)
indexOf
utilise la comparaison d'égalité stricte alors queincludes
l' algorithme SameValueZero est utilisé . Pour cette raison, les deux points de divergence suivants se posent.Comme l'a souligné Felix Kling , le comportement est différent en cas de
NaN
.undefined
.Utilisation en chaîne
( Lien vers la spécification ECMAScript)
indexOf
, il traitera le RegExp comme une chaîne et renverra l'index de la chaîne, s'il est trouvé. Cependant, si vous passez un RegExp àincludes
, il lèvera une exception.Performance
Comme l'a souligné 538ROMEO ,
includes
peut être un peu (très petit) peu plus lent (car il doit rechercher une expression régulière comme premier argument) queindexOf
mais en réalité, cela ne fait pas beaucoup de différence et est négligeable.L'histoire
String.prototype.includes()
a été introduit dans ECMAScript 2015 alors qu'il aArray.prototype.includes()
été introduit dans ECMAScript 2016. En ce qui concerne la prise en charge du navigateur, utilisez-les à bon escient.String.prototype.indexOf()
etArray.prototype.indexOf()
sont présents dans l'édition ES5 d'ECMAScript et donc pris en charge par tous les navigateurs.la source
indexOf
donnetrue
après mise explicitementundefined
dans un tableau:let arr=[undefined];
oulet arr=[];arr[0]=undefined;
maintenantarr.indexOf(undefined) === 0
undefined
: La raison en est que.includes
les éléments manquants sont traités commeundefined
, tandis que.indexOf()
ignorant. Vous pouvez également «créer» des éléments manquants avecarr[number beyond length] = whatever
..includes()
ne mange que des chaînes. En réalité, les deux méthodes contraignent n'importe quoi à une chaîne aussi bonne que possible. Regex est expressément exclu comme argument pour.includes()
pour permettre des ajouts futurs à la norme selon le projet actuel.Conceptuellement, vous devriez utiliser indexOf lorsque vous voulez utiliser la position indexOf qui vous donne simplement pour extraire la valeur ou opérer sur le tableau, c'est-à-dire en utilisant slice, shift ou split après avoir obtenu la position de l'élément. D'autre part, Use Array.includes uniquement pour savoir si la valeur est à l'intérieur du tableau et non la position car vous ne vous en souciez pas.
la source
indexOf()
etincludes()
peuvent tous deux être utilisés pour rechercher des éléments dans un tableau, cependant chaque fonction produit des valeurs de retour différentes.indexOf
renvoie un nombre (-1
si l'élément n'est pas présent dans le tableau, ou la position du tableau si l'élément est présent).includes()
renvoie une valeur booléenne (true
oufalse
).la source