Omitindo a segunda expressão ao usar a abreviação if-else

290

Posso escrever a if elsetaquigrafia sem a else?

var x=1;

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

Percebi que colocar nullpara o resto funciona (mas não faço ideia do porquê ou se é uma boa ideia).

Edit: Alguns de vocês parecem confusos por que eu me daria ao trabalho de tentar isso. Tenha certeza de que é pura curiosidade. Eu gosto de brincar com JavaScript.

Nikki
fonte
Eu acho que há uma var | varsintaxe. Cuidado, pois é potencialmente difícil "ver", especialmente os ternários (IMO) sendo problemáticos. Use moderadamente.
Jared Farrish
@JaredFarrish Não é o ponto principal dos ternários que é mais fácil "ver" do que usar as declarações if? Além disso, qual é a sintaxe que você está falando, parece interessante.
Hassan
1
Não, não acho que seja mais fácil em todos os casos. O "ponto inteiro" em minha mente é colocar tudo em uma linha ("meus códigos são mais curtos que os seus") ou para casos literais específicos com resultados simplistas. O empilhamento de ternários é particularmente pernicioso e deve ser evitado a todo custo. :)
Jared Farrish
1
@ Hasan - eu vi algo como foo = bar | cat;, onde se o primeiro é falso? null ?, ele "cai" para o segundo. Eu só vi isso e não o uso.
Jared Farrish,
3
@JaredFarrish: Isso é a || bou a && b, caso contrário b, sempre será avaliado.
Kennytm

Respostas:

263

Esta também é uma opção:

x==2 && dosomething();

dosomething()só será chamado se x==2for avaliado como verdadeiro. Isso é chamado de curto-circuito .

Não é comumente usado em casos como esse e você realmente não deve escrever um código como este. Encorajo essa abordagem mais simples:

if(x==2) dosomething();

Você deve escrever código legível o tempo todo; Se você estiver preocupado com o tamanho do arquivo, crie uma versão reduzida com a ajuda de um dos muitos compressores JS. (por exemplo, o compilador de fechamento do Google )

ajax333221
fonte
10
Oh, curto-circuito, certo. A legibilidade do código é subestimada, acho que na maioria dos desenvolvedores intermediários e em alguns "profissionais experientes".
Jared Farrish
2
Tecnicamente, você não precisa de chaves: if (1 - 1 === 0) $('.woot').text('Woot!'); eu uso esse formulário o tempo todo com PHP, e agora que estou adotando o Coffeescript, também o uso no meu Javascript.
be hollenbeck
5
Pessoalmente, acredito que se é um pequeno se com um resultado se verdadeiro .. é mais rápido e fácil escrever x == 2 && dosomething ();
22614 Dean Meehan
9
if x==2 && doSomething() || doSomethingElse()
Agustín
1
Desejo JavaScript incluído esta sintaxe Rubi-like: doSomething() if x === 2. Não sinto falta de Ruby, mas sinto falta disso.
22618 Chad Johnson
743

O que você tem é um uso bastante incomum do operador ternário . Geralmente é usado como uma expressão, não uma declaração, dentro de alguma outra operação, por exemplo:

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

Portanto, para facilitar a leitura (porque o que você está fazendo é incomum) e porque evita o "outro" que você não deseja, sugiro:

if (x==2) doSomething();
Nicole
fonte
Aqui podemos adicionar a linha de chegada inserida como um comando completo (como meu exemplo usa a função jquery fade in e fade out) x == 2? $ (elemento) .fadeIn (): $ (elemento) .fadeIn (); Não é obrigatório ter uma variável de retorno (como var y no primeiro código).
Prageeth godage
1
você deve usar sinais triplos "=" para que a lógica seja perfeita. como em var y = (x === 2? "sim": "não");
fino
63

Outra opção:

x === 2 ? doSomething() : void 0;
Buzinas
fonte
3
Se alguém não sabe por que usar vazio 0 sugiro ler este elo
Carlinhos
20

Se você não está fazendo o resto, por que não fazer:

if (x==2) doSomething();
Prescott
fonte
4
você pode fazê-lo mesmo se você fizer a outra pessoa
nmirceac
14

Usar nullé bom para um dos ramos de uma expressão ternária. E uma expressão ternária é boa como uma declaração em Javascript.

Por uma questão de estilo, no entanto, se você tiver em mente invocar um procedimento, é mais claro escrever isso usando if..else:

if (x==2) doSomething;
else doSomethingElse

ou, no seu caso,

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

Pequena adição a esta linha muito antiga ..

Se your'e avaliar uma expressão dentro de um for/ whileloop com um operador ternário, e quer continueou breakcomo resultado - você vai ter um problema porque ambos continuee breaknão são expressões , eles são declarações sem qualquer valor.

Isso produzirá Uncaught SyntaxError: Unexpected token continue

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

Se você realmente deseja um one-liner que retorne uma declaração, use-o:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Esse código pode levantar algumas sobrancelhas. Apenas dizendo.. :)
DotBot
fonte
4

Tecnicamente, colocar nulo ou 0 ou apenas algum valor aleatório funciona (já que você não está usando o valor de retorno). No entanto, por que você está usando essa construção em vez da ifconstrução? É menos óbvio o que você está tentando fazer quando escreve código dessa maneira, pois pode confundir as pessoas com o no-op (nulo no seu caso).

nhahtdh
fonte
2

Provavelmente o menor (com base no operador OR e sua precedência )

x-2||dosomething()

Kamil Kiełczewski
fonte