96 votes

JavaScript opérateur ternaire exemple avec les fonctions

Je suis à l'aide de jQuery 1.7.1

Je commence tout juste à utiliser le JavaScript opérateur ternaire pour remplacer simple if/else. Je l'ai fait avec succès dans plusieurs endroits. J'ai été surpris quand j'ai réussi à faire quelque chose d'autre que je croyais que ce ne serait pas, mais j'ai essayé quand même.

Voici l'original de la déclaration:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    if (IsChecked == true){
        removeItem($this);
    } else {
        addItem($this);
    }
}

Voici la même fonction à l'aide de l'opérateur ternaire:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    (IsChecked == true) ? removeItem($this) : addItem($this);
}

J'ai été surpris parce que tous les exemples que j'ai vu être utilisés étaient simplement de la définition de variables comme ceci:

x = (1 < 2) ? true : false;

Ma question est de savoir si c'est "normal" d'utilisation et fonctionne dans la plupart des versions de JavaScript? Où est-il échouer? Existe-il d'autres moins évidents utilise pour cela?

Mise à JOUR -- Merci pour le "monde réel" des conseils!!!

Je me sers de ce que ma fonction:

function updateItem() {
    $this = $(this);
    $this.hasClass("IsChecked") ? removeItem($this) : addItem($this);
}

195voto

JonnyReeves Points 3678

Heh, il y a quelques très excitant utilise de ternaire de syntaxe dans votre question; j'aime la dernière, la meilleure...

x = (1 < 2) ? true : false;

L'utilisation de ternaire ici est totalement uncessesary - vous peut simplement écrire

x = (1 < 2);

De même, la condition de l'élément d'un ternaire instruction est toujours évalué comme une valeur Booléenne, par conséquent, vous pouvez exprimer:

(IsChecked == true) ? removeItem($this) : addItem($this);

Tout simplement que:

(IsChecked) ? removeItem($this) : addItem($this);

Enfait, je voudrais aussi supprimer l' IsChecked temporaire ainsi qui vous laisse avec:

($this.hasClass("IsChecked")) ? removeItem($this) : addItem($this);

Pour déterminer si c'est acceptable de la syntaxe, c'est sûr! C'est un excellent moyen de réduire les quatre lignes de code en un seul, sans incidence sur la lisibilité. Le mot seul conseil que je peux vous donner est d'éviter l'imbrication de plusieurs ternaire instructions sur la même ligne (que la voie est de la folie!)

24voto

Surreal Dreams Points 12016

Le ternaire style est généralement utilisé pour économiser de l'espace. Sémantiquement, ils sont identiques. Je préfère aller avec le plein de if/then/else syntaxe car je n'aime pas à sacrifier la lisibilité - je suis de la vieille école et je préfère mes broches.

Le plein de if/then/else format est utilisé pour à peu près tout. Il est particulièrement populaire si vous obtenez dans les plus grands blocs de code dans chaque direction générale, vous avez un muti-ramifiée si/d'autre de l'arbre, ou plusieurs else/ifs dans une longue chaîne.

L'opérateur ternaire est commun lorsque vous assignez une valeur à une variable basée sur une condition simple ou vous êtes à la prise de plusieurs décisions très brièvement les résultats. L'exemple que vous citez ne fait pas de sens, car l'expression à évaluer à l'une des deux valeurs, sans aucune logique supplémentaire.

De bonnes idées:

this > that ? alert(this) : alert(that);  //nice and short, little loss of meaning

if(expression)  //longer blocks but organized and can be grasped by humans
{
    //35 lines of code here
}
else if (something_else)
{
    //40 more lines here
}
else if (another_one)  /etc, etc
{
    ...

Le moins bon:

this > that ? testFucntion() ? thirdFunction() ? imlost() : whathappuh() : lostinsyntax() : thisisprobablybrokennow() ? //I'm lost in my own (awful) example by now.
//Not complete... or for average humans to read.

if(this != that)  //Ternary would be done by now
{
    x = this;
}
else
}
    x = this + 2;
}

Une base vraiment la règle de pouce - pouvez-vous comprendre la chose entière aussi bien ou mieux sur une seule ligne? Ternaire est OK. Sinon le développer.

8voto

Jeff B Points 20021

Il n'y a rien de particulièrement délicate à propos de l'exemple que vous avez posté.

Dans un opérateur ternaire, le premier argument (le conditionnel) est évaluée et si le résultat est true, le deuxième argument est évalué et s'est retourné, sinon, la troisième est évalué et s'en retourna. Chacun de ces arguments peut être valable bloc de code, y compris les appels de fonction.

Pensez-y de cette façon:

var x = (1 < 2) ? true : false;

Peut aussi être écrite comme:

var x = (1 < 2) ? getTrueValue() : getFalseValue();

C'est parfaitement valide, et ces fonctions peuvent contenir n'importe quel code, s'il est lié au renvoi de la valeur ou pas. En outre, les résultats de l'opération ternaire n'ont pas à être affecté à rien, tout comme les résultats de la fonction n'ont pas à être affecté à n'importe quoi:

(1 < 2) ? getTrueValue() : getFalseValue();

Maintenant, il suffit de les remplacer par celles de toutes les fonctions arbitraires, et vous êtes de gauche avec quelque chose comme votre exemple:

(1 < 2) ? removeItem($this) : addItem($this);

Maintenant, votre dernier exemple n'a pas vraiment besoin d'un ternaire, comme il peut être écrit comme ceci:

x = (1 < 2);  // x will be set to "true"

6voto

Sam W Points 39

Si vous allez nid ternaire opérateurs, je crois que vous aimeriez faire quelque chose comme ceci:

   var audience = (countrycode == 'eu') ? 'audienceEU' :
                  (countrycode == 'jp') ? 'audienceJP' :
                  (countrycode == 'cn') ? 'audienceCN' :
                  'audienceUS';

C'est beaucoup plus efficace d'écrire/lire que:

var audience = 'audienceUS';
if countrycode == 'eu' {
   audience = 'audienceEU';
} else if countrycode == 'jp' {
   audience = 'audienceJP';
} else if countrycode == 'cn' {
   audience = 'audienceCN';
}

Comme dans tous les bons de programmation, d'espaces rend tout agréable pour les gens qui ont à lire votre code une fois que vous avez terminé avec le projet.

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