Vous ne pouvez pas le faire dans un switch
sauf si vous faites une correspondance complète de chaînes; qui fait la correspondance de sous-chaînes . (Ce n'est pas tout à fait vrai, comme Sean le souligne dans les commentaires. Voir la note à la fin.)
Si vous êtes satisfait que votre expression régulière en haut supprime tout ce que vous ne voulez pas comparer dans votre correspondance, vous n'avez pas besoin d'une correspondance de sous-chaîne et pouvez faire:
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
... mais encore une fois, cela ne fonctionne que si c'est la chaîne complète que vous correspondez. Il échouerait si base_url_string
, disons, "yyy.xxx.local" alors que votre code actuel correspondrait à celui de la branche "xxx.local".
Mise à jour : OK, donc techniquement, vous pouvez utiliser un switch
pour la correspondance de sous-chaînes, mais je ne le recommanderais pas dans la plupart des situations. Voici comment ( exemple en direct ):
function test(str) {
switch (true) {
case /xyz/.test(str):
display("• Matched 'xyz' test");
break;
case /test/.test(str):
display("• Matched 'test' test");
break;
case /ing/.test(str):
display("• Matched 'ing' test");
break;
default:
display("• Didn't match any test");
break;
}
}
Cela fonctionne en raison de la façon dont les switch
instructions JavaScript fonctionnent , en particulier de deux aspects clés: premièrement, que les cas sont considérés dans l' ordre du texte source , et deuxièmement que les expressions de sélecteur (les bits après le mot-clé case
) sont des expressions qui sont évaluées comme ce cas est évalué (pas de constantes comme dans certains autres langages). Donc, puisque notre expression de test est true
, la première case
expression qui en résulte true
sera celle qui sera utilisée.
switch(true) { case /foo/.test(bar): ....
true
là-bas, vous laissez tout simplement de côté.RegExp peut être utilisé sur la chaîne d'entrée non seulement techniquement mais aussi pratiquement avec la
match
méthode.Comme la sortie de l '
match()
est un tableau, nous devons récupérer le premier élément du tableau du résultat. Lorsque la correspondance échoue, la fonction retournenull
. Pour éviter une erreur d'exception, nous allons ajouter l'||
opérateur conditionnel avant d'accéder au premier élément du tableau et tester par rapport à lainput
propriété qui est une propriété statique des expressions régulières qui contient la chaîne d'entrée.Une autre approche consiste à utiliser le
String()
constructeur pour convertir le tableau résultant qui ne doit avoir qu'un seul élément (pas de groupes de capture) et toute la chaîne doit être capturée avec quanitifiers (.*
) en une chaîne. En cas d'échec, l'null
objet deviendra une"null"
chaîne. Pas pratique.Quoi qu'il en soit, une solution plus élégante consiste à utiliser la méthode
/^find-this-in/.test(str)
withswitch (true)
qui renvoie simplement une valeur booléenne et il est plus facile de rechercher sans respecter la casse.la source
Utilisez simplement la propriété location.host
la source
switch ("" + location.host)
.Une autre option consiste à utiliser le
input
champ d'un résultat de correspondance d'expression régulière :la source
.length:
-> Si la correspondance est faite, l'expression ternaire renvoie le jeton d'origine
----> Le jeton d'origine est évalué par cas
-> Si la correspondance n'est pas faite, le ternaire renvoie undefined
----> Case évalue le jeton par rapport à undefined, ce qui, espérons-le, n'est pas votre jeton.
Le test ternaire peut être n'importe quoi par exemple dans votre cas
============================================
est une expression ternaire.
Le test dans ce cas est token.match (/ spo /) qui indique la correspondance entre la chaîne contenue dans le jeton et l'expression regex / spo / (qui est la chaîne littérale spo dans ce cas).
Si l'expression et la chaîne correspondent, cela donne la valeur true et renvoie le jeton (qui est la chaîne sur laquelle l'instruction switch fonctionne).
Evidemment token === token donc l'instruction switch est mise en correspondance et le cas évalué
Il est plus facile à comprendre si vous le regardez en couches et comprenez que le test de tournage est évalué "AVANT" l'instruction switch de sorte que l'instruction switch ne voit que les résultats du test.
la source
token.match(/spo/)
cela correspondrait.Cela peut être plus facile. Essayez de penser comme ceci:
:
la source
TypeError: url.match(...) is null
Peut-être trop tard et tout, mais j'ai aimé cela dans l'affectation de cas :)
vous pourriez éventuellement aller plus loin, passer une liste d'options et gérer l'expression régulière avec |
la source
|| {}
à|| [-1]
ou similaire pour la sécurité de type. Aussi, pourquoi est-ilnew RegExp
utilisé, pas seulement des barres obliques?