Instrukcja JavaScript „jednowierszowa” - najlepsza składnia, ta alternatywa?

201

Zostało jednak wyraźnie powiedziane, choć opinia, że ​​rezygnacja z nawiasów klamrowych w ifinstrukcji jednowierszowej nie jest idealna ze względu na łatwość konserwacji i czytelność.

Ale co z tym?

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

Jest jeszcze bardziej skompresowany, a jeśli zostanie rozszerzony, nawiasy klamrowe nie zostaną zapomniane. Czy są jakieś rażące problemy, a jeśli nie, jakie są tego względy? Wydaje mi się, że nadal jest bardzo czytelny, przynajmniej tak samo jak operator trójskładnikowy. Wydaje mi się, że operatory trójskładnikowe nie są tak sugerowane ze względu na czytelność, chociaż wydaje mi się, że taki wniosek nie jest tak jednogłośny.

Zły bliźniak we mnie chce to zasugerować, chociaż oczywiście składnia nie jest do tego przeznaczona i prawdopodobnie jest to po prostu zły pomysł.

(syntax) ? document.write("My evil twin emerges"): "";
David Hobs
źródło
2
Byłoby miło, gdyby JavaScript obsługiwał warunki warunkowe końca frazy:document.write("My evil twin emerges") if lemons
Beau Smith,
7
Myślę, że możesz myśleć o krótkim oświadczeniu if, else. ( variable = (condition) ? true-value : false-value;.) Powodzenia.
Progo,

Odpowiedzi:

328

Widziałem zachowanie &&operatora powodujące zwarcie , chociaż ludzie, którzy nie są do tego przyzwyczajeni, mogą mieć trudności z odczytaniem lub nawet nazwać to anty-wzorem:

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

Osobiście często używam pojedynczej linii ifbez nawiasów, tak jak to:

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

Jeśli muszę dodać więcej instrukcji, umieszczę je w następnym wierszu i dodam nawiasy. Ponieważ moje IDE wykonuje automatyczne wcięcia, zastrzeżenia dotyczące utrzymania tej praktyki są dyskusyjne.

Peter Olson
źródło
11
Lubię to drugie. Dzięki za wkład i jeszcze jedną kreatywną alternatywę za pierwszym razem!
David Hobs
powinieneś wiedzieć, czego się spodziewasz, ponieważ pusty ciąg i 0 są wartościami fałszowania, to nie powiedzie się wykonanie drugiej instrukcji
Orlando
1
Oczywiście równie dobrze możesz umieścić tam bardziej wyraźne oświadczenie boolowskie
acjay
7
@PeterOlson, dlaczego dyskusje na temat zarzutów związanych z utrzymywalnością? Co się stanie, jeśli jakikolwiek inny programista nie użyje Twojego IDE z jego konfiguracją.
agconti
2
Dziękujemy, że jesteś wystarczająco odważny, aby wypowiadać się na korzyść pojedynczej linii, jeśli stwierdzenia bez nawiasów. Pewnego dnia nasze dzieci będą ci wdzięczne.
Marc M.
135

Używam tego w ten sposób:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");
asael2
źródło
35
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji
43

Możesz użyć tego formatu, który jest powszechnie używany w PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");
Makro
źródło
12
Nie potrzebujesz nawiasów na lemon.
leymannx
6
Najlepszą praktyką może być dołączenie () wokół instrukcji warunkowej - usuwa wszelkie nieporozumienia co do kolejności operacji itp. Dla innych programistów. Zwykle mylę się, by to określić, chyba że nie ma sposobu, aby ktoś przyzwoicie wykwalifikowany mógł się pomylić.
djvs
1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh
Podobają mi się nawiasy, ponieważ implikują one boolowski przymus.
Daniel Sokołowski
18

Ta jedna linia jest znacznie czystsza.

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

Wolę to. mam nadzieję, że to komuś pomoże

shakee93
źródło
16

mogę tego użyć,

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

wyjaśnienie: jeśli lemonsistnieje, to daj mialert("please give me a lemonade") else alert("then give me a beer")

Mohideen bin Mohammed
źródło
Świetne rozwiązanie.
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

// Kolejny prosty przykład

 var a = 11;
 a == 10 ? alert("true") : alert("false");
użytkownik3413838
źródło
15
dlaczego nie po prostu .. var a = 11; alert(a === 10);?
ManuKaracho
@ManuKaracho Często widzę ten problem podczas pracy z oświadczeniami trójskładnikowymi. Rozumiem, że OP mógł właśnie próbować napisać prosty, ale szerzy się w kodzie, który czytam w pracy.
adam-beck
alert(a === 10 ? "true" : "false")
Josh Wood
@JoshWood alert wyświetli również logiczne booleany, więc możesz zrobić tak, alert(a===10)jak powiedział Manu.
Keith
12

Jak wiele osób powiedziało, jeśli szukasz rzeczywistej 1 linii, jeśli:

    if (Boolean_expression) do.something();

jest preferowany. Jeśli jednak chcesz zrobić if / else, trójka jest twoim przyjacielem (a także super cool):

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

RÓWNIEŻ:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Widziałem jednak jeden bardzo fajny przykład. Krzyczy do @ Peter-Oslson dla &&

    (Boolean_expression) && do.something();

Wreszcie, nie jest to instrukcja if, ale wykonywanie rzeczy w pętli za pomocą map / redukcja lub Promise.resolve () jest również zabawne. Krzyczy do @brunettdan

Kemacal
źródło
7

Jak już wspomniano, możesz użyć:

i styl

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

lub

styl bez uchwytów

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

powrót zwarciowy

Jeśli jednak chcesz użyć ifinstrukcji jednowierszowej do zwarcia funkcji, musisz użyć wersji bez wspornika, takiej jak:

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

tak jak

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

da ci SyntaxError: Unexpected keyword 'return'

Marc
źródło
W zwarciach jednoliniowych możemy pominąć „powrót” i powinien on działać zgodnie z oczekiwaniami. `` cytryny i foo dały mi pasek ”; // Pracuje! ``
siwalikm
@ siwalikm mógłbyś wyjaśnić? Jest tak w przypadku, gdy nie chcesz wracać lemons(jeśli to jest falsey) - chcesz zwrócić „foo dał mi pasek”, gdy lemonsjest to prawdą.
Marc
jeśli (cytryny) zwracają „foo dał mi pasek”; To jest źle.
Otrzymasz
@Fenec czy podzielisz się przeglądarką i wersją, która powoduje ten błąd? To działało dla mnie prawie 2 lata temu i nadal działa dla mnie.
Marc
4

Widziałem wiele odpowiedzi z wieloma głosami opowiadającymi się za użyciem operatora trójskładnikowego. Trójskładnik jest świetny, jeśli a) masz alternatywną opcję i b) zwracasz dość prostą wartość z prostego warunku. Ale...

Pierwotne pytanie nie miało alternatywy, a operator trójskładnikowy z tylko jedną (rzeczywistą) gałęzią zmusza do zwrócenia błędnej odpowiedzi.

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

Myślę, że najczęstszą odmianą jest lemons ? 'foo...' : ''i, jak się dowiesz po przeczytaniu niezliczonej ilości artykułów dla dowolnego języka na temat prawdy, fałszu, prawdy, falsey, null, zero, pustego, pustego (z naszym bez?), Wchodzisz pole minowe (choć dobrze udokumentowane pole minowe).

Gdy tylko jakakolwiek część trójki stanie się skomplikowana, lepiej skorzystać z bardziej wyraźnej formy warunkowej.

Długa droga do stwierdzenia, że ​​głosuję if (lemons) "foo".

Anita Graham
źródło
2

Można to również zrobić za pomocą pojedynczej linii z whilepętlami i iftak:

if (blah)
    doThis();

Działa również z whilepętlami.

Noitidart
źródło
7
Spowoduje to, że nie będzie kłaczków i nie jest zalecane
Danwellman
9
OP poprosił także o linijkę.
kodowanie aaron
2

Przykład funkcji strzałek:

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

W obietnicach:

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

Inaczej:

if(somethingTrue) thenDo()

Jeśli jest to zwykły warunek, wolę używać if (wartość), gdy tylko jest to możliwe, ponieważ słowo if na początku oświadczenia mówi więcej o tym, co się dzieje, niż paranteza i znaki zapytania.

brunettdan
źródło
1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Nawet przypisanie operacji możemy również wykonać za pomocą nawiasów okrągłych

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));
Sajith Mantharath
źródło
„Nawet operację przypisania możemy wykonać również za pomocą nawiasów okrągłych”. Jest to bardzo interesujące, nie wiedziałem, że można było przypisać operacje wewnątrz tych operacji jednowierszowych.
sagits