72 votes

JavaScript: indexOf vs Match lors de la recherche de chaînes?

La lisibilité de côté, il y a aucune perceptibles écarts (de performance, peut-être) entre l'utilisation de

str.indexOf("src") 

et

str.match(/src/)

Personnellement, je préfère match (et regexp) mais les collègues semblent aller dans l'autre sens. Nous nous demandions si c'était ...?

EDIT:

J'aurais dit au début que c'est pour des fonctions qui feront partielle de la plaine-correspondance de chaîne (pour ramasser les identifiants dans les attributs de classe pour JQuery) plutôt que par des recherches à base de regexp avec des caractères génériques, etc.

class='redBorder DisablesGuiClass-2345-2d73-83hf-8293' 

La différence entre:

string.indexOf('DisablesGuiClass-');

VS

string.match(/DisablesGuiClass-/)

61voto

Box9 Points 41987

RegExp est en effet plus lent que indexOf (vous pouvez le voir ici ), bien que normalement cela ne devrait pas être un problème. Avec RegExp, vous devez également vous assurer que la chaîne est correctement échappée, ce qui est une chose supplémentaire à considérer.

Mis à part ces deux problèmes, si deux outils font exactement ce dont vous avez besoin, pourquoi ne pas choisir le plus simple?

19voto

Tim Pietzcker Points 146308

Vous êtes à comparer des pommes avec des oranges. indexOf est utilisé avec plaine de chaînes de caractères et est donc très rapide; match prend une expression régulière - bien sûr, il est plus lente en comparaison, mais si vous voulez faire une regex match, vous n'irez pas loin avec indexOf.

Utiliser le bon outil pour le travail à la main.

Dans votre cas, si vous êtes à la recherche d'un verbatim de la chaîne, indexOf devrait être suffisant. Il y a toujours une demande pour les regexes, même si: Si vous avez besoin de faire correspondre ensemble de mots et que vous voulez éviter les chaînes de correspondance, puis les expressions régulières vous donner "frontière de mot ancres". Par exemple:

indexOf('bar')

trouverez bar trois fois, en bar, fubar, barmy, alors que

match(/\bbar\b/)

ne correspondent bar quand il ne fait pas partie d'un plus long terme.

11voto

Yogesh Mangaj Points 334

Si vous essayez de rechercher des occurrences de sous - chaînes sans tenir compte de la casse, alors match semble être plus rapide qu'une combinaison de indexOf et toLowerCase()

Vérifiez ici - http://jsperf.com/regexp-vs-indexof/152

5voto

LukeH Points 110965

À l'aide de indexOf devrait, en théorie, être plus rapide qu'une regex, quand vous êtes juste à la recherche pour certains de texte brut, mais vous devriez faire un peu de repères comparatifs vous-même si vous êtes préoccupé par la performance.

Si vous préférez match et il est assez rapide pour vos besoins, alors aller pour elle.

Pour ce que ça vaut, je suis d'accord avec vos collègues sur ce point: je ne l'utiliserais indexOf lors de la recherche d'une simple chaîne de caractères, et l'utilisation match etc seulement quand j'ai besoin de la fonctionnalité supplémentaire fournie par des expressions régulières.

4voto

ChaosPandion Points 37025

En termes de performances, indexOf sera à tout le moins légèrement plus rapide que match . Tout se résume à la mise en œuvre spécifique. Pour décider lequel utiliser, posez-vous la question suivante:

Un index entier suffit-il ou ai-je besoin de la fonctionnalité d'un résultat de correspondance RegExp?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X