Pominięcie drugiego wyrażenia przy użyciu skrótu if-else

290

Czy mogę napisać if elseskrót bez else?

var x=1;

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

Zauważyłem, że nakładanie nullna pozostałe działa (ale nie mam pojęcia, dlaczego lub czy to dobry pomysł).

Edycja: Niektórzy z was wydają się oszołomieni, dlaczego tak się staram. Zapewniam, że to czysta ciekawość. Lubię bawić się w JavaScript.

Nikki
źródło
Myślę, że istnieje var | varskładnia. Ostrożnie, ponieważ potencjalnie trudno ją „zobaczyć”, zwłaszcza, że ​​trójskładniki (IMO) są problematyczne. Używaj oszczędnie.
Jared Farrish
@JaredFarrish Czy nie chodzi o to, że łatwiej jest je „zobaczyć” niż trójki, niż przy użyciu instrukcji if? Także o jakiej składni mówisz, wygląda interesująco.
Hassan
1
Nie, nie sądzę, aby były łatwiejsze we wszystkich przypadkach. „Cały punkt” w moim umyśle polega na umieszczeniu tego wszystkiego w jednym wierszu („moje kody krótsze od twojego”) lub w konkretnych, dosłownych przypadkach z uproszczonymi rezultatami. Układanie trójskładników jest szczególnie szkodliwe i należy tego unikać za wszelką cenę. :)
Jared Farrish
1
@Hassan - Widziałem coś takiego foo = bar | cat;, gdzie jeśli pierwszy jest fałszywy? null ?, „wpada” do drugiego. Widziałem to jednak i nie używam go.
Jared Farrish
3
@JaredFarrish: To a || blub a && binaczej bbędzie zawsze oceniane.
kennytm

Odpowiedzi:

263

Jest to również opcja:

x==2 && dosomething();

dosomething()zostanie wywołane tylko wtedy, gdy x==2zostanie ocenione jako prawdziwe. Nazywa się to zwarciem .

Nie jest to powszechnie używane w takich przypadkach i naprawdę nie powinieneś pisać takiego kodu. Zachęcam do tego prostszego podejścia:

if(x==2) dosomething();

Przez cały czas powinieneś pisać czytelny kod; jeśli martwisz się rozmiarem pliku, po prostu stwórz jego zminimalizowaną wersję za pomocą jednego z wielu kompresorów JS. (np. Kompilator zamknięcia Google )

ajax333221
źródło
10
Och, zwarcie, prawda. Czytelność kodu jest niedoceniana. Myślę, że w większości pośrednich programistów i niektórych „doświadczonych profesjonalistów”.
Jared Farrish,
2
Technicznie nie potrzebujesz nawiasów klamrowych: if (1 - 1 === 0) $('.woot').text('Woot!'); używam tej formy przez cały czas w PHP, a teraz, kiedy używam Coffeescript, używam go również w JavaScript.
be hollenbeck
5
Osobiście uważam, że jeśli jest mały, jeśli z jednym wynikiem, jeśli jest prawdziwy .. jego szybsze i łatwiejsze do napisania x == 2 && dosomething ();
Dean Meehan
9
if x==2 && doSomething() || doSomethingElse()
Agustín
1
Życzę JavaScript włączone to Ruby podobną składnię: doSomething() if x === 2. Nie tęsknię za Ruby, ale tęsknię.
Chad Johnson
743

To, co masz, to dość nietypowe użycie operatora trójskładnikowego . Zwykle jest używany jako wyrażenie, a nie wyrażenie, w ramach innej operacji, np .:

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

Zatem dla czytelności (ponieważ to, co robisz, jest niezwykłe) i ponieważ pozwala uniknąć „innych”, których nie chcesz, sugerowałbym:

if (x==2) doSomething();
Nicole
źródło
Tutaj możemy dodać linię końcową wstawioną jako pełne polecenie (jak w moim przykładzie użyj funkcji zwiększania i zmniejszania jquery) x == 2? $ (element) .fadeIn (): $ (element) .fadeIn (); Zmienna zwrotna nie jest obowiązkowa (jak var y w pierwszym kodzie).
Prageeth godage
1
musisz użyć potrójnych znaków „=”, aby logika była idealna. jak w var y = (x === 2? „tak”: „nie”);
fino
63

Inna opcja:

x === 2 ? doSomething() : void 0;
Buzinas
źródło
3
Jeśli ktoś nie wie, po co używać void 0, sugeruję przeczytać ten link
Carlinhos,
20

Jeśli nie robisz nic innego, dlaczego nie:

if (x==2) doSomething();
Prescott
źródło
4
możesz to zrobić, nawet jeśli zrobisz inaczej
nmirceac
14

Używanie nulljest w porządku dla jednej z gałęzi wyrażenia trójskładnikowego. Wyrażenie trójkowe jest w porządku w JavaScript.

Jednak ze względu na styl, jeśli masz na myśli wywołanie procedury, łatwiej jest napisać to za pomocą if..else:

if (x==2) doSomething;
else doSomethingElse

lub, w twoim przypadku,

if (x==2) doSomething;
Ted Hopp
źródło
6

Drobny dodatek do tego bardzo starego wątku ..

Jeśli your'e oceny wyrażenie wewnątrz for/ whilepętli z operatorem potrójnego, a chcą continuelub breakjako wynik - będziesz mieć problem, ponieważ oba continuei breaknie są wyrażenia , są oświadczenia bez wartości.

To wytworzy Uncaught SyntaxError: Unexpected token continue

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

Jeśli naprawdę chcesz mieć linijkę, która zwraca instrukcję, możesz użyć tego:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - ten kod może budzić brwi. Tylko mówię.. :)
DotBot
źródło
4

Technicznie, wstawianie wartości null lub 0, lub po prostu losowa wartość działa (ponieważ nie używasz wartości zwracanej). Dlaczego jednak używasz tego konstruktu zamiast ifkonstruktu? Mniej oczywiste jest, co próbujesz zrobić, pisząc kod w ten sposób, ponieważ możesz pomylić ludzi z brakiem operacji (w twoim przypadku jest to null).

nhahtdh
źródło