Expressions dans JavaScript Ternary Operator et JSLint

J'ai récemment reçu un commentaire sur l'un de mes articles de blog sur JSLint demandant pourquoi JSLint a lancé une erreur avec ce qui suit:

s === "test" ? MyFunc() : MyFunc2(); 

L'erreur générée était:

"J'ai attendu une affectation ou un appel de fonction et à la place a vu une expression".

De toute évidence, JSLint s'attend à une affectation ici, quelque chose de plus comme:

 var y = (s === "test") ? MyFunc() : MyFunc2(); 

Mais, je ne vois pas vraiment le problème avec le premier exemple. Est-ce vraiment vrai que les opérateurs ternaires ne devraient être utilisés que pour des missions?

Je ne pouvais rien voir sur JSLint.com , et il n'y avait rien d'évident dans le livre JavaScript: The Good Parts. Et, la même erreur est également signalée dans la fourchette communautaire JSHint .

N'importe qui?

C'est une expression. C'est équivalent à l'écriture

0 === 1;

Vous écrivez une expression qui a des effets secondaires immédiats et qui est considérée comme mauvaise.

Généralement, les expressions sont des déclarations inutiles qui n'ont aucun effet secondaire. Il est considéré comme une meilleure forme pour tout simplement faire

 if (s === "test") { MyFunc(); } else { MyFunc2(); } 

En dehors de cela, c'est une syntaxe parfaitement solide. Personnellement, je suis d'accord que l'écriture d'un ternaire ters comme alternative à un if est mauvais et que vous préférez l'utiliser pour l'affectation.

Une autre expression à courte main qui a été (ab) utilisée pour terse-ness

 someCondition && doMagic(magic); someCondition || doMagic(magic); 

Encore une fois, ceux-ci sont considérés comme une mauvaise forme si ils ne sont utilisés que comme expressions, car l'utilisation de ceux-ci obscurcit simplement le logique et rend plus difficile le maintien du code.

JSHint a une option expr pour cela. Voir billet

Fonctionnement:

 /*jshint expr: true */ var s, MyFunc, MyFunc2; s === "test" ? MyFunc() : MyFunc2(); 0 === 1; 

Passera