Ce que vous voyez dans les outils de développement de chrome, c'est le fichier valeur de parachèvement de la déclaration de commutation. En principe, la valeur de la dernière expression évaluée (mais pas tout à fait, par exemple, la valeur d'achèvement de var a = 42
n'est pas 42). La valeur d'achèvement est une construction dans ECAMScript qui est généralement cachée au programmeur. Bien qu'elle apparaisse également sous la forme de l'élément valeur de retour de eval()
.
La grammaire des affectations de variables s'attend à ce qu'une expression figure sur son côté droit. L'utilisation d'une instruction switch à cet endroit constitue donc une erreur de syntaxe :
"var" <name> "=" <expression>
En fait, la différence entre les déclarations et les expressions est que les expressions calculent une valeur alors que les déclarations ne le font pas. Les appels de fonction, l'arithmétique et les littéraux sont tous des expressions, par exemple. "If" et "switch" (commutateur) déclarations ne le sont pas.
Il n'y a aucun moyen de capturer la valeur d'achèvement d'une instruction, sauf peut-être en l'enveloppant dans un appel eval :
var a = eval('switch (3) { default: "OK" }')
console.log(a) // => "OK"
Mais utiliser eval pour cela pas une bonne idée .
Malheureusement, il n'existe pas de moyen efficace d'archiver ce que vous voulez faire. Comme d'autres réponses l'ont mentionné, vous pourriez envelopper le commutateur dans une fonction (ou IIFE ) et utiliser return
pour obtenir la valeur :
const a = (() => {
switch(3) { default: return "OK"; }
})();
Vous pourriez trouver que ce n'est pas une solution idéale et vous n'êtes pas le seul à avoir ce problème avec JavaScript.
J'ai cru comprendre que c'était l'une des motivations des Filtrage de motifs Proposition d'ECAMScript. Mais la proposition est en phase 1 et n'est pas encore prête pour une utilisation en production.
En outre, vous pourriez vouloir écrire votre code d'une manière qui ne nécessite pas de switch
des déclarations du tout. Il y a quelque temps, je suis tombé sur le modèle suivant, qui est apparemment courant en Lua mais que je n'ai jamais vu utilisé en JavaScript :
Au lieu d'utiliser une instruction de commutation, vous pouvez placer tous vos cas en tant que propriétés dans un objet JavaScript et utiliser des fonctions comme valeurs à la place de la logique dans les différents cas. case
blocs. Cela pourrait ressembler à quelque chose comme ceci :
const cases = {
"FOO": () => 1,
"BAR": () => 2,
"BAR": () => 3,
};
const value = "FOO";
const result = cases[value]();
console.log(result); // => 1
Au lieu de ça :
let result;
switch (value) {
case "FOO":
result = 1;
break;
case "BAR":
result = 2;
break;
case "BAR":
result = 3;
break;
}
Si vous avez besoin de cas qui ne sont pas des chaînes de caractères, vous pourriez vouloir utiliser une Carte .