ternario - ternary operator javascript without else
Expresiones en JavaScript Ternary Operator y JSLint (1)
Hace poco recibí un comentario en una de las publicaciones de mi blog sobre JSLint preguntando por qué JSLint lanzó un error con lo siguiente:
s === "test" ? MyFunc() : MyFunc2();
El error generado fue:
"Se esperaba una asignación de función o llamada de función y, en cambio, se veía una expresión".
Claramente JSLint está esperando una asignación aquí, algo más como:
var y = (s === "test") ? MyFunc() : MyFunc2();
Pero, realmente no veo el problema con el primer ejemplo. ¿Es realmente el caso que los operadores ternarios solo deben usarse para tareas?
No pude ver nada en JSLint.com , ni hubo nada aparente en el libro JavaScript: The Good Parts. Y, el mismo error también se informa en la bifurcación comunitaria JSHint .
¿Nadie?
Es una expresión. Es equivalente a escribir
0 === 1;
Estás escribiendo una expresión que tiene efectos secundarios inmediatos y eso se considera malo.
Generalmente las expresiones son declaraciones inútiles que no tienen ningún efecto secundario. Se considera mejor forma de hacer simplemente.
if (s === "test") {
MyFunc();
} else {
MyFunc2();
}
Aparte de eso es perfectamente sintaxis sólida. Personalmente estoy de acuerdo en que escribir un ternario conciso como una alternativa a un if
es malo y es mejor que lo uses solo para la asignación.
Otra expresión corta de la mano que se ha utilizado (ab) para la tersura
someCondition && doMagic(magic);
someCondition || doMagic(magic);
Nuevamente, estos se consideran de mala forma si se usan solo como expresiones, ya que al usarlas solo se oculta la lógica y se hace más difícil mantener el código.
JSHint tiene una opción expr
para esto. Ver ticket
Corriendo:
/*jshint
expr: true
*/
var s, MyFunc, MyFunc2;
s === "test" ? MyFunc() : MyFunc2();
0 === 1;
Pasará