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"): "";

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.


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");

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");

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


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")


Ś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");

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


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'


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".


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.


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.


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, '@&'));

„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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.