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:
Expression régulière :
(new RegExp('word')).test(str) // or /word/.test(str)
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!