2010-12-15 59 views
4

Je suis sûr qu'il doit y avoir une réponse très simple à cela, mais au risque de paraître stupide - je ne peux pas obtenir cette déclaration de commutateur pour fonctionner. L'entrée var, 'status' peut être soit 'publique' soit 'brouillon', et je peux vous assurer qu'elle ne contient qu'une de ces deux valeurs car je l'ai alertée à différentes étapes, et de toute façon, la déclaration if fonctionne ici . Jetez un coup d'oeil:Javascript switch déclaration-très simple, qu'est-ce que je fais mal?

 function switch_status(status){ 
      if (status == 'public'){ 
       return false; 
      } if (status == 'draft') { 
       return true; 
      } 

^Cela fonctionne, mais en remplaçant le 'si' avec cette déclaration de 'commutateur' ci-dessous ne fonctionne pas.

  switch(status){ 
      case 'public': 
       return false; 
      case 'draft': 
       return true; 
      } 
     } 

Le premier à me fournir l'inévitable réponse embarrassante simple gagne mon accolade!

EDIT: Voici mon plein code-

 $('.status').live('click', 
       function(){ 
        fullClass = $(this).attr('class'); 
        id = fullClass.split(' ').slice(-1); 
        status = fullClass.split(' ').slice(-2,-1); 
        var newStatus = switch_status(status); 
        alert(newStatus); 
      }); 

     function switch_status(status){ 
//    if (status == 'public'){ 
//     return false; 
//    } if (status == 'draft') { 
//     return true; 
//    } 

      switch(status){ 
       case 'public': 
        return false; 
       case 'draft': 
        return true; 
      } 
     } 
+1

Y at-il une erreur signalée lors de l'utilisation de 'switch'? Un code de contexte peut aussi aider - rien affiché ne démontre un problème. –

+0

Essayez d'ajouter un bloc de code par défaut après le cas final - par défaut: return false – lnrbob

+0

@ g.d.d.c Je viens d'ajouter la question avec le code complet. L'alerte dit 'indéfini', mais en remplaçant le 'switch' par le 'if', j'obtiens les bonnes valeurs retournées ... (! ??) – Inigo

Répondre

4

vous passez status comme un tableau d'une chaîne (le résultat de slice) plutôt que comme une simple chaîne.

Lorsque vous vérifiez l'égalité entre votre tableau et votre chaîne, il semble que la coercition provoque le contrôle d'égalité. Mais la coercition ne se produit pas dans une déclaration de commutation.

Si je change

status = fullClass.split(' ').slice(-2,-1); 

à

status = fullClass.split(' ').slice(-2,-1)[0]; 

il fonctionne très bien.

+0

Ce sera la clé ici. Bonne prise. –

+0

@ JacobM Hahaha, vous danseur! MERCI! Donc, si je ne m'éloigne pas trop des limites de cette question, comment le convertiriez-vous en une ficelle? (Juste pour conclure) Merci. – Inigo

+0

Modifié pour ajouter le correctif. –

1

Je suppose que ce problème est dû à la conversion de type. Javascipt est généralement un langage faiblement typé. L'instruction if que vous avez utilisée précédemment utilisait une comparaison lâche de ==. Cela a très bien fonctionné.

Cependant, les instructions switch sont différentes. Pour que le cas soit une correspondance, les types de données doivent correspondre. En d'autres termes, le status doit être converti en chaîne avant d'être transmis à l'instruction switch.

0

J'ai utilisé .each dans une boucle jquery et ai comparé la valeur à 'this'; Je pouvais clairement voir que 'ceci' avait la valeur correcte si j'utilisais console.log. Cela a fonctionné dans la logique if/else mais a échoué dans la logique switch/case.

La solution est la suivante:

var obj = this.toString();

switch(obj){ 
    case 'one': ... 
    case 'two': ... 
} 

En forçant le « ceci » à un type de chaîne, la logique du commutateur fonctionne maintenant.