2012-06-17 5 views
229

¿Puedo escribir la taquigrafía "si no" sin el otro?Javascript si no es taquigrafía

por ejemplo:

var x=1; 

x==2? dosomething:doNothingButContinueCode; 

me he dado cuenta de que pone 'nulo' para los demás funciona pero no tengo ni idea de por qué o si eso es una buena idea.

EDITAR: Algunos de ustedes parecen desconcertados por qué me molestaría en probar esto. Tenga la seguridad de que es puramente por curiosidad. Me gusta jugar con js.

+0

Creo que hay una 'var | sintaxis var' Cuidado ya que es potencialmente difícil "ver", especialmente (IMO) ternaries siendo problemático. Utilizar con moderación. –

+0

@JaredFarrish ¿No es el objetivo de Ternaries que sean más fáciles de "ver" que usar declaraciones if? Además, ¿de qué está hablando esa sintaxis? Parece interesante. – Hassan

+1

No, no creo que sean más fáciles en todos los casos. El "punto total" en mi mente es ponerlo todo en una línea ("mis códigos son más cortos que el tuyo") o para casos literales específicos con resultados simplistas. Apilar ternaries es particularmente pernicioso y debe evitarse a toda costa. ':)' –

Respuesta

209

Esta es también una opción:

x == 2 && dosomething(); 

dosomething() es llamado solo si x == 2. Esto se llama Short-circuiting.

No se usa comúnmente en casos como este y realmente no debería escribir código como este. Aliento este enfoque en su lugar:

if(x == 2) { dosomething(); } 

Debe escribir el código legible en todo momento; si le preocupa el tamaño del archivo, simplemente cree una versión reducida con la ayuda de uno de los miles de compresores JS. (Recomiendo Closure Compiler de Google)

+7

Oh, cortocircuito, derecha . La legibilidad del código es poco apreciada, creo que en la mayoría de los desarrolladores intermedios y algunos "profesionales experimentados". –

+2

Técnicamente no necesita llaves: 'if (1 - 1 === 0) $ ('. Woot'). Texto ('Woot!');' Utilizo ese formulario todo el tiempo con PHP, y ahora que estoy adoptando Coffeescript, también lo uso en mi Javascript. –

+4

Personalmente, creo que si es pequeño, con un resultado si es verdadero ... es más rápido y fácil escribir x == 2 && dosomething(); –

15

Si usted no está haciendo lo demás, ¿por qué no hacer:

if (x==2) doSomething(); 
+4

puede hacerlo incluso si hace lo siguiente – nmirceac

10

Usando null está muy bien para una de las ramas de una expresión ternaria. Y una expresión ternaria está bien como una declaración en Javascript.

Como una cuestión de estilo, sin embargo, si tiene en cuenta la invocación de un procedimiento, que es más clara para escribir esta usando if..else:

if (x==2) doSomething; 
else doSomethingElse 

o, en su caso,

if (x==2) doSomething; 
3

Técnicamente, poner nulo o 0, o simplemente algún valor aleatorio funciona (ya que no está utilizando el valor devuelto). Sin embargo, ¿por qué está utilizando esta construcción en lugar de la construcción if? Es menos obvio lo que intenta hacer cuando escribe el código de esta manera, ya que puede confundir a las personas con no-op (nulo en su caso).

676

Lo que tiene es un uso bastante inusual del ternary operator. Por lo general se utiliza como una expresión, no una declaración, en el interior de alguna otra operación, por ejemplo:

var y = (x == 2 ? "yes" : "no"); 

Por lo tanto, para facilitar la lectura (ya que lo que está haciendo es inusual), y porque evita el "otro" que usted no quiere, sugeriría:

if (x==2) doSomething(); 
+0

Aquí podemos agregar una línea de finalización insertada como un comando completo (como en mi ejemplo use la función de fundido de entrada y salida de jquery) x == 2? $ (elemento) .fadeIn(): $ (elemento) .fadeIn(); No es obligatorio tener una variable de retorno (como var y en el primer código). – Prageeth

+1

debe usar signos triples "=" para que la lógica sea perfecta. como en var y = (x === 2? "yes": "no"); – fino

+2

@fino Eso es cierto técnicamente, pero si se usa cuando no es estrictamente necesario, '===' a menudo causa más problemas de los que resuelve. Por ejemplo, ¿realmente * querrías que '2' coincidiera, pero no con' "2" '? JavaScript (y lenguajes similares) hacen que sea fácil no importar cuál es cuál; por ejemplo, la entrada del usuario desde un campo de texto será una cadena, y se puede comparar con un Número-2 con '==' sin conversión. '===' causaría un problema allí. – Nicole

48

Otra opción:

x === 2 ? doSomething() : void 0; 
+2

Si alguien no sabe por qué usar el vacío 0, sugiero que lea este [enlace] (https://stackoverflow.com/questions/7452341/what-does-void-0-mean) – Carlinhos

4

Una pequeña adición a esto muy, muy antiguo hilo ..

Digamos que estás por dentro de un bucle for y la necesidad de evaluar una variable para un valor truthy/falsy con un operador ternario, mientras que en caso de que sea falsy desea continue - vas a tener un problema porque estás por no devolver un expresión, devuelve en su lugar una declaración sin ningún valor.

Esto producirá Uncaught SyntaxError: Unexpected token continue

for (var i = 0; i < myArray.length; i++) { 
     myArray[i].value ? alert('yay') : continue; 
} 

Por lo tanto, si desea devolver una declaración y seguir utilizando una línea para el código, si bien puede parecer un poco extraño a primera vista, y no puede seguir el uso del lenguaje estricta , se puede hacer esto en su lugar:

for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i].value) alert('yay') ; else continue; 
    } 
  • PS - este código puede ser difícil de leer o comprender lo que no siempre será la mejor opción para usar. Solo digo ... :)