Le mode le plus rapide pour vérifier une chaîne contient une autre sous-chaîne en JavaScript?

Je travaille avec un problème de performance sur JavaScript. Je voudrais simplement demander: quel est le moyen le plus rapide de vérifier si une chaîne contient une autre sous-chaîne (j'ai juste besoin de la valeur booléenne)? Pourriez-vous suggérer votre idée et votre exemple de code d'extrait?

Vous avez deux possibilités:

  1. Expression régulière :

     (new RegExp('word')).test(str) // or /word/.test(str) 
  2. indexOf :

     str.indexOf('word') !== -1 

Les expressions régulières semblent être plus rapides (au moins dans Chrome 10).

Test de performance – palissandre courte
Test de performance – longue meule de foin

Mettre à jour:

On ne peut pas dire avec certitude quelle méthode est plus rapide. Les différences entre les navigateurs sont énormes. Alors que dans Chrome 10 indexOf semble être plus rapide, dans Safari 5, indexOf est nettement plus lent que toute autre méthode.

Vous devez voir et essayer pour vous-même. Cela dépend de vos besoins. Par exemple, une recherche insensible à la casse est beaucoup plus rapide avec des expressions régulières.

Est-ce que ça marche pour toi?

 string1.indexOf(string2) >= 0 

Modifier: Ce n'est peut-être pas plus rapide qu'un RegExp si le string2 contient des motifs répétés. Sur certains navigateurs, indexOf peut être beaucoup plus lent que RegExp. Voir les commentaires.

Edit 2: RegExp peut être plus rapide que l'indexOf lorsque les chaînes sont très longues et / ou contiennent des motifs répétés. Voir les commentaires et la réponse de @ Felix.

J'ai trouvé que l'utilisation d'une simple boucle, itérant sur tous les éléments de la chaîne et la comparaison de l'utilisation de charAt fonctionne plus rapidement que l' indexOf ou Regex . Le code et la preuve sont disponibles chez JSPerf .

ETA: indexOf et indexOf tous deux des indexOf similaires sur Chrome Mobile selon les données de Navigator Scope listées sur jsperf.com

Pour trouver une chaîne simple, utiliser la méthode indexOf () et utiliser regex est à peu près la même: http://jsperf.com/substring – choisissez donc ce qui semble plus facile à écrire.

Dans ES6, la méthode include() est utilisée pour déterminer si une chaîne peut être trouvée dans une autre chaîne, renvoyant true ou false selon le cas.

 var str = 'To be, or not to be, that is the question.'; console.log(str.includes('To be')); // true console.log(str.includes('question')); // true console.log(str.includes('nonexistent')); // false 

Voici jsperf entre

 var ret = str.includes('one'); 

Et

 var ret = (str.indexOf('one') !== -1); 

Comme le montre le résultat dans jsperf, il semble que les deux fonctionnent bien.

J'ai fait un jsben.ch pour vous http://jsben.ch/#/aWxtF … semble que indexOf est un peu plus rapide.

C'est un moyen simple d'utiliser la méthode .match() pour string.

 var re = /(AND|OR|MAYBE)/; var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING"; console.log('Do we found something?', Boolean(str.match(re))); 

Je vous souhaite une belle journée, monsieur!