Declaração JavaScript de linha única 'if' - melhor sintaxe, esta alternativa?

201

Foi dito claramente, embora a opinião não obstante, que os colchetes em uma ifdeclaração de linha única não sejam ideais para manutenção e legibilidade.

Mas e isso?

if (lemons) { document.write("foo gave me a bar"); }

É ainda mais compactado e, se expandido, os colchetes não serão esquecidos. Existem problemas flagrantes e, se não, quais são as considerações? Eu sinto que ainda é muito legível, pelo menos tanto quanto um operador ternário de qualquer maneira. Parece-me que os operadores ternários não são tão sugeridos devido à legibilidade, embora eu ache que essa conclusão não seja tão unânime.

O gêmeo maligno em mim quer sugerir isso, embora a sintaxe obviamente não seja para isso e provavelmente seja apenas uma má idéia.

(syntax) ? document.write("My evil twin emerges"): "";
David Hobs
fonte
2
Seria bom se o JavaScript suportasse condicionais de final de frase:document.write("My evil twin emerges") if lemons
Beau Smith
7
Eu acho que você pode estar pensando na breve declaração if, else. ( variable = (condition) ? true-value : false-value;.) Boa sorte.
Progo

Respostas:

328

Vi o comportamento em curto-circuito do &&operador usado para conseguir isso, embora as pessoas que não estão acostumadas a isso possam achar difícil ler ou até chamá-lo de antipadrão:

lemons && document.write("foo gave me a bar");  

Pessoalmente, usarei frequentemente linha única ifsem colchetes, assim:

if (lemons) document.write("foo gave me a bar");

Se precisar adicionar mais instruções, colocarei as instruções na próxima linha e adicionarei colchetes. Como meu IDE faz recuo automático, as objeções de manutenção a essa prática são discutíveis.

Peter Olson
fonte
11
Eu gosto do último. Obrigado pela contribuição e mais uma alternativa criativa no primeiro!
quer
você deve saber o que você está esperando, desde string vazia e 0 são valores Falsas, ele irá falhar a executar a segunda instrução
Orlando
1
Claro, você pode muito bem colocar uma declaração boolean mais explícito lá
acjay
7
@PeterOlson Por que as objeções de manutenção são discutíveis? E se algum outro desenvolvedor não usar seu IDE com sua configuração.
10134 agconti
2
Obrigado por ser corajoso o suficiente para falar em apoio à linha única, se não houver colchetes. Um dia nossos filhos vão agradecer.
Marc M.
136

Eu uso assim:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
asael2
fonte
36
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji
43

Você pode usar este formato, que é comumente usado em PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
Macro
fonte
12
Você não precisa de colchetes no lemon.
Leymannx
6
Pode ser uma boa prática incluir () em torno de uma instrução condicional - remove qualquer confusão quanto à ordem das operações, etc. para outros desenvolvedores. Eu geralmente erro em especificá-lo, exceto quando não há como alguém decentemente qualificado ficar confuso.
djvs
1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh
Eu gosto dos colchetes, pois para mim eles implicam uma coerção booleana.
Daniel Sokolowski
18

Essa linha é muito mais limpa.

if(dog) alert('bark bark');

Eu prefiro isso. espero que ajude alguém

shakee93
fonte
16

pode usar isso,

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

explicação: se lemonsexistir, dê-me umaalert("please give me a lemonade") else alert("then give me a beer")

Mohideen bin Mohammed
fonte
Ótima solução.
Davidson Lima
1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib
15

// Outro exemplo simples

 var a = 11;
 a == 10 ? alert("true") : alert("false");
user3413838
fonte
15
por que não simplesmente .. var a = 11; alert(a === 10);?
ManuKaracho
@ManuKaracho Eu vejo muito esse problema ao trabalhar com declarações ternárias. Entendo que o OP pode estar apenas tentando escrever um simples, mas é galopante no código que li no trabalho.
adam-beck
alert(a === 10 ? "true" : "false")
18719 Josh Wood
@ JoshWood, o alerta também imprimirá booleanos, para que você possa fazer alert(a===10)como Manu disse.
Keith
12

Como muitas pessoas disseram, se você está procurando uma linha 1 real, se:

    if (Boolean_expression) do.something();

é preferível. No entanto, se você está procurando fazer um if / else, então ternário é seu amigo (e também super legal):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

ALÉM DISSO:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

No entanto, eu vi um exemplo muito legal. Grita para @ Peter-Oslson por &&

    (Boolean_expression) && do.something();

Por fim, não é uma instrução if, mas executar coisas em um loop com um map / reduzir ou Promise.resolve () também é divertido. Gritos para @brunettdan

Kemacal
fonte
7

Como já foi afirmado, você pode usar:

&& estilo

lemons && document.write("foo gave me a bar");  

ou

estilo sem suporte

if (lemons) document.write("foo gave me a bar");

retorno de curto-circuito

Se, no entanto, você deseja usar a ifinstrução de uma linha para causar um curto-circuito em uma função, precisará usar a versão sem colchetes da seguinte forma:

if (lemons) return "foo gave me a bar";

Como

lemons && return "foo gave me a bar"; // does not work!

vai te dar uma SyntaxError: Unexpected keyword 'return'

Marc
fonte
Em curto-circuitos de linha única, podemos omitir 'return' e deve funcionar como esperado. `` `limões &&" foo me deu um bar "; // trabalho! ``
siwalikm
@siwalikm você poderia explicar? Este é o caso em que você não deseja retornar lemons(se for falsey) - você só quer retornar "foo deu-me barra" quando lemonsé verdade.
Marc
se (limões) retornar "foo me deu um bar"; isto está errado.
Dará a
@Fenec você compartilharia o navegador e a versão que causam esse erro? Isso funcionou para mim há quase 2 anos e continua a funcionar para mim.
Marc
4

Eu já vi muitas respostas com muitos votos defendendo o uso do operador ternário. O ternário é ótimo se: a) você tem uma opção alternativa eb) está retornando um valor bastante simples a partir de uma condição simples. Mas...

A pergunta original não tinha alternativa, e o operador ternário com apenas uma única ramificação (real) obriga a retornar uma resposta confusa.

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Eu acho que a variação mais comum é lemons ? 'foo...' : '' e, como você saberá lendo uma infinidade de artigos para qualquer idioma em true, false, truthy, falsey, null, nil, nil, blank, empty (with our without?), Você está entrando um campo minado (embora um campo minado bem documentado).

Assim que qualquer parte do ternário se complica, é melhor ter uma forma mais explícita de condicional.

Um longo caminho para dizer que estou votando if (lemons) "foo".

Anita Graham
fonte
2

Isso também pode ser feito usando uma única linha com whileloops e ifassim:

if (blah)
    doThis();

Também funciona com whileloops.

Noitidart
fonte
7
Isto irá falhar linting e não é recomendado
danwellman
9
O OP também pediu uma linha.
aaron-coding
2

Exemplo em funções de seta:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

Promessas:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

De outra forma:

if(somethingTrue) thenDo()

Se for apenas uma condicional simples, prefiro usar if (value) sempre que possível, porque a palavra if no início da declaração diz mais sobre o que está acontecendo do que parênteses e pontos de interrogação.

brunettdan
fonte
1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Mesmo atribuir operação também podemos fazer com colchetes

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
Sajith Mantharath
fonte
"Mesmo atribuir operação também podemos fazer com colchetes". Isso é muito interessante, eu não sabia que era possível atribuir operações dentro dessas operações de linha única.
sagits