58 votes

Comment obtenir la valeur de retour d'une instruction switch ?

Dans la console de chrome, quand je tape :

> switch(3){default:"OK"}
  "OK"

Il semble donc que l'instruction switch ait une valeur de retour. Mais quand je le fais :

> var a = switch(3){default:"OK"}

Il y a une erreur de syntaxe "Unexpected Token switch".

Est-il possible de capturer l'instruction de retour du commutateur ?

1voto

Moritz Points 362

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 .

0voto

Daniel A. White Points 91889

Chrome ne fait que vous montrer la dernière valeur évaluée. Il n'y a pas de sortie d'une switch . Il suffit d'utiliser une variable.

var a; 

switch(3)
{
  default:
    a = "OK";
}

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