2011-06-06 27 views
23

poco recibí un comentario en uno de mis blogs sobre JSLint preguntando por qué JSLint arrojó un error con el siguiente: generadaExpresiones en JavaScript ternario del operador y de JSLint

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

El error fue:

"Esperaba una asignación o función llamada y en su lugar vio una expresión."

Claramente JSLint está esperando una misión aquí, somthing más como:

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

Pero, yo no veo el problema con el primer ejemplo. ¿Es realmente el caso que los operadores ternarios solo deberían usarse para asignaciones?

No pude ver nada en JSLint.com, ni aparecía nada en el libro JavaScript: The Good Parts. Y, el mismo error también se informa en el fork de la comunidad JSHint.

¿Alguien?

Respuesta

34

Es una expresión. Es equivalente a la escritura

0 === 1;

Estás escribiendo una expresión que tiene efectos secundarios inmediatos y que es considerado malo.

Generalmente, las expresiones son declaraciones inútiles que no tienen ningún efecto secundario. Se considera una mejor forma simplemente hacer

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

Aparte de eso, es una sintaxis perfectamente sólida. Personalmente, estoy de acuerdo en que escribir un ternario breve como alternativa a un if es malo y es mejor que solo lo utilices para la tarea.

Otros expresión abreviada que han sido (ab) usado para escueto-dad

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

Una vez más éstos formen malos son considerados si hay utilizarse sólo como expresiones porque el uso de estos sólo oscurece la lógica de distancia y hacer que sea más difícil mantener el código.

JSHint tiene una opción expr para esto. Ver ticket

de reproducción:

/*jshint 
    expr: true 
*/ 

var s, MyFunc, MyFunc2; 
s === "test" ? MyFunc() : MyFunc2(); 
0 === 1; 

pasará

+1

1 para una respuesta desde las poderosas Raynos. Debo admitir que a veces uso expresiones abreviadas en lugar de declaraciones 'if'. Raramente ternario, generalmente algo como 'match && doSomethingWith (match)'. Pero eso es solo porque soy flojo: P En general, creo que hay un par de cosas de las que se queja JSLint que pueden ignorar cuando entran en juego las preferencias personales. –

+1

@Andy E: me doy cuenta de que hay partes de JSLint donde entran en juego las preferencias personales, pero estaba interesado en ver el mismo mensaje enviado por JSHint también. Sin embargo, siempre es bueno saberlo. –

+1

@JamesWiseman JSHint le permite un _lot_ de personalización.Hay una opción 'expr' para suprimir estas advertencias. En mi opinión, los simples '||', '&&' o '?' Están bien, pero puedo ver por qué podrían ser malos. – Raynos

Cuestiones relacionadas