Omitir la segunda expresión cuando se usa la abreviatura if-else

290

¿Puedo escribir la if elsetaquigrafía sin el else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

He notado que poner nullpara lo demás funciona (pero no tengo idea de por qué o si es una buena idea).

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

Nikki
fuente
Creo que hay una var | varsintaxis. Cuidado ya que es potencialmente difícil "ver", especialmente los ternarios (IMO) que son problemáticos. Utilizar con moderación.
Jared Farrish
@JaredFarrish ¿No es todo el punto de los ternarios que son más fáciles de "ver" que usar declaraciones if? Además, ¿de qué sintaxis estás hablando? Parece interesante.
Hassan
1
No, no creo que sean más fáciles en todos los casos. El "punto principal" en mi mente es ponerlo todo en una línea ("mis códigos más cortos que los suyos") o para casos literales específicos con resultados simplistas. Apilar ternaries es particularmente pernicioso y debe evitarse a toda costa. :)
Jared Farrish
1
@Hassan: he visto algo así foo = bar | cat;, ¿dónde si el primero es falso? nulo ?, se "cae" al segundo. Sin embargo, solo lo he visto y no lo uso.
Jared Farrish
3
@JaredFarrish: Eso es a || bo a && b, de lo contrario b, siempre se evaluará.
kennytm

Respuestas:

263

Esta también es una opción:

x==2 && dosomething();

dosomething()solo se llamará si x==2se evalúa como verdadero. Esto se llama cortocircuito .

No se usa comúnmente en casos como este y realmente no debería escribir código como este. Animo este enfoque más simple:

if(x==2) dosomething();

Debe escribir 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 muchos compresores JS. (por ejemplo, el compilador de cierre de Google )

ajax333221
fuente
10
Oh, cortocircuito, cierto. La legibilidad del código es poco apreciada, creo que en la mayoría de los desarrolladores intermedios y algunos "profesionales experimentados".
Jared Farrish
2
Técnicamente, no necesita llaves: if (1 - 1 === 0) $('.woot').text('Woot!'); uso ese formulario todo el tiempo con PHP, y ahora que estoy adoptando Coffeescript, también lo uso en mi Javascript.
be hollenbeck
55
Personalmente, creo que si es pequeño si con un resultado si es verdadero ... es más rápido y fácil escribir x == 2 && dosomething ();
Dean Meehan
99
if x==2 && doSomething() || doSomethingElse()
Agustín
1
Deseo JavaScript incluido esta sintaxis de Ruby-como: doSomething() if x === 2. No extraño a Ruby, pero sí extraño eso.
Chad Johnson
743

Lo que tiene es un uso bastante inusual del operador ternario . Por lo general, se usa como una expresión, no como una declaración, dentro de alguna otra operación, por ejemplo:

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

Entonces, para facilitar la lectura (porque lo que está haciendo es inusual), y porque evita el "más" que no desea, sugeriría:

if (x==2) doSomething();
Nicole
fuente
Aquí podemos agregar la línea de meta insertada como un comando completo (como en mi ejemplo, uso jquery función de fundido de entrada y salida) x == 2? $ (elemento) .fadeIn (): $ (elemento) .fadeIn (); No es obligatorio tener una variable de retorno (como var y en el primer código).
Prageeth godage
1
debes usar signos triples "=" para que la lógica sea perfecta. como en var y = (x === 2? "yes": "no");
fino
63

Otra opción:

x === 2 ? doSomething() : void 0;
Buzinas
fuente
3
Si alguien no sabe por qué usar el vacío 0, sugiero leer este enlace
Carlinhos
20

Si no estás haciendo lo demás, ¿por qué no hacerlo?

if (x==2) doSomething();
Prescott
fuente
44
puedes hacerlo incluso si haces lo demás
nmirceac
14

Usar nullestá bien para una de las ramas de una expresión ternaria. Y una expresión ternaria está bien como una declaración en Javascript.

Sin embargo, como cuestión de estilo, si tiene en mente invocar un procedimiento, es más claro escribirlo usando if..else:

if (x==2) doSomething;
else doSomethingElse

o, en tu caso,

if (x==2) doSomething;
Ted Hopp
fuente
6

Pequeña adición a este hilo muy antiguo.

Si estás por la evaluación de una expresión dentro de un for/ whilebucle con un operador ternario, y quieren continueo breakcomo resultado - vas a tener un problema porque los dos continuey breakno son expresiones , son declaraciones sin ningún valor.

Esto producirá Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Si realmente desea una línea que devuelva una declaración, puede usar esto en su lugar:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PD: este código puede levantar algunas cejas. Solo digo.. :)
DotBot
fuente
4

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

nhahtdh
fuente