2012-04-25 20 views
13

Mientras estaba matando el tiempo buscando patrones de taquigrafía de Javascript, me encontré con una forma interesante de expresar una declaración ifhere. Las siguientes obras:¿Usando '&&' como una abreviación de instrucción if?

​var var1 = 5; 
var var2 = 1; 

var1 == 5 && var2++; 

creo que es un (más limpio y más corto,) forma totalmente fresco de escribir una declaración if que sólo tiene que hacer una operación. Sin embargo, me encontré con un problema con el siguiente código tan pronto como he intentado algo más con ella:

​var var1 = 5; 
var var2 = 1; 

var1 == 5 && var2 = 2; 

En lugar de trabajar como el primer fragmento de código, mi prueba arroja un error:

Uncaught ReferenceError: Invalid left-hand side in assignment

¿Por qué no funciona esto, y por qué el lado izquierdo de mi declaración es invocado como incorrecto en oposición a la mano derecha?

+7

Esto no es "totalmente fresco (y más corto, más limpio)" manera de escribir un 'si '. No es más limpio, y es mucho más ilegible e imposible de mantener (en realidad lo has probado al hacer esta pregunta). –

+0

Si sabe lo que esto significa, se ve más limpio (imho) y es más corto que escribir tres líneas. Todavía soy un novato, por eso tuve que hacer esta pregunta.Además, es totalmente genial, no puedes discutir eso. :) –

+0

Como dije, no lo es. Puede escribir un 'si' en menos de tres líneas, y todavía es legible. Sin embargo, puedo decir que eres un novato, porque piensas que esto es mejor. :) La gente con experiencia sabría que el código fácil de leer y mantener es mejor que "genial, pero difícil de entender". –

Respuesta

23

Esto no funciona porque el operador && tiene mayor prioridad que el operador =. En otras palabras, el código se interpreta así:

(var1 == 5 && var2) = 2; 

Si coloca manualmente paréntesis alrededor de la asignación, que será interpretado correctamente.

var1 == 5 && (var2 = 2); 

Otras personas que reprender para escribir código como este, diciendo que es una mala idea porque hace que la intención del código más difícil de leer - lo cual es cierto, sobre todo para personas no familiarizadas con este idiom-- pero es importante probarlo y experimentar con cosas como esta para ver por ti mismo lo que sucede. Ya has encontrado una de las cosas molestas sobre este enfoque.

De todos modos, en casos como este, yo personalmente prefiero usar sola línea if declaraciones, como este

if(condition) statement; 

Aunque estoy seguro de que otros le dirán que eso es mal estilo porque hay que agregar manualmente los soportes cuando necesitas más declaraciones, esto realmente no me ha mordido ni a IMO, es más limpio que usar tres líneas solo por una condición simple, como dijiste.

+0

Muy bien, eso responde mi pregunta principal. Pero tengo otro: ¿por qué '(var1 == 5 && var2)', como el lado izquierdo del enunciado, siendo llamado como incorrecto, entonces? ¿No es lo mismo que decir 'if (var1 == 5 && var2! = Undefined)'? Eso debería funcionar y, en su lugar, llamar a la mano derecha. –

+1

@ElliotBonneville '(var1 == 5 && var2)' está arrojando un error porque no es una expulsión válida del lado izquierdo en una tarea. No tiene sentido tener eso como el lado izquierdo, ¿a qué se le asignaría '2'? –

+0

Oho, correcto, eso tiene sentido. ¡Gracias por aclarar esto! Aceptando en ... 8 minutos. –

1

porque está utilizando un operador no válido en el lado derecho. está tratando de leer todo el enunciado como una variable única.

11

No se alarme de que esto no funciona como era de esperar, de hecho hace menos de un mes Brendan Eich (creador de JavaScript) compartía con nosotros que este tipo de uso es mejor conocido como " abuso "del lenguaje, ya que este operador lógico no está destinado a ejecutar código como este, sino que está destinado a determinar el valor de una expresión.

"I also agree...that the && line is an abusage, allowed due to JS’s C heritage by way of Java, but frowned upon by most JS hackers; and that an if statement would be much better style..." http://brendaneich.com/2012/04/the-infernal-semicolon/

Dicho esto, se puede evitar el problema de precedencia de los operadores envolviendo sus declaraciones:

(var1 == 5) && (var2 = 2) 
+4

+1 para la nota sobre "abuso": eso es exactamente. –

+0

¡Gracias por el enlace! –

Cuestiones relacionadas