2012-06-17 12 views
229

Czy mogę napisać skrót "if else" bez innego?Skrypty JavaScript w języku angielskim, jeśli nie są dostępne.

np

var x=1; 

x==2? dosomething:doNothingButContinueCode; 

Zauważyłem oddanie „null” dla robót indziej, ale nie mam pojęcia, dlaczego i czy to dobry pomysł.

EDYCJA: Niektórzy z was wydają się być zaskoczeni, dlaczego nie próbowałem tego. Bądźcie pewni, że to czysto z ciekawości. Lubię bawić się z js.

+0

Myślę, że jest 'var | składnia var'. Ostrożnie, ponieważ jest to potencjalnie trudne do "zobaczenia", w szczególności (IMO), które stanowią problem. Używaj oszczędnie. –

+0

@JaredFarrish Czy nie jest to o tyle ważne, że łatwiej je "zobaczyć" niż używać instrukcji if? Również o tym, o czym mówisz, wygląda interesująco. – Hassan

+1

Nie, nie sądzę, że w ogóle są łatwiejsze. "Cały punkt" w mojej głowie polega albo na umieszczeniu wszystkiego na jednej linii ("moje kody są krótsze niż twoje"), albo na konkretnych, dosłownych przypadkach z uproszczonymi wynikami. Układanie ternariów jest szczególnie szkodliwe i powinno się ich unikać za wszelką cenę. ':)' –

Odpowiedz

209

jest także opcja:

x == 2 && dosomething(); 

dosomething() zostanie wywołana tylko jeśli x == 2. Nazywa się to Short-circuiting.

Nie jest powszechnie stosowany w takich przypadkach i naprawdę nie powinieneś pisać takich kodów. Zamiast tego zachęcam do takiego podejścia:

if(x == 2) { dosomething(); } 

Powinieneś zawsze pisać czytelny kod; jeśli martwisz się o rozmiar pliku, po prostu utwórz jego zminimalizowaną wersję za pomocą jednego z tysięcy kompresorów JS. (Polecam Google Closure Compiler)

+7

Och, zwarcie, prawda . Czytelność kodu jest niedoceniana, jak sądzę, w większości pośrednich programistów i niektórych "doświadczonych profesjonalistów". –

+2

Technicznie nie trzeba szelki: 'if (1 - 1 === 0) $ ('woot. ') Tekst (' Woot!');' używam tej formie przez cały czas. PHP, a teraz, gdy przyjmuję Coffeescript, używam go również w moim Javascript. –

+4

Osobiście wierzę, że jeśli jest mały, jeśli z jednym wynikiem, jeśli jest prawdziwy, to szybciej i łatwiej pisać x == 2 && dosomething(); –

15

Jeśli nie robi to inaczej, to dlaczego nie zrobić:

if (x==2) doSomething(); 
+4

możesz to zrobić, nawet jeśli robisz coś innego – nmirceac

10

Korzystanie null jest dobre dla jednego z oddziałów potrójnego wyrazu. A wyrażenie potrójne jest w porządku jako instrukcja w Javascript.

W gruncie stylu, chociaż, jeśli masz na myśli wywoływanie procedury, to jaśniej napisać to za pomocą if..else:

if (x==2) doSomething; 
else doSomethingElse 

lub, w danym przypadku,

if (x==2) doSomething; 
3

Pod względem technicznym wstawianie wartości NULL lub 0, lub tylko niektórych losowych wartości () działa (ponieważ nie używa się wartości zwracanej). Dlaczego jednak używasz tego konstruktu zamiast konstrukcji if? Mniej oczywiste jest to, co próbujesz zrobić, kiedy piszesz kod w ten sposób, ponieważ możesz pomylić ludzi z no-op (w twoim przypadku zero).

676

To, co masz, to dość niezwykłe użycie modelu ternary operator. Zazwyczaj jest on stosowany jako wyraz, a nie oświadczeniem, wewnątrz jakiejś innej operacji, np

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

Tak, dla czytelności (bo to co robisz jest niczym niezwykłym), i dlatego, że unika „else”, który nie chcesz, proponuję:

if (x==2) doSomething(); 
+0

Tutaj możemy dodać linię mety wstawianą jako pełne polecenie (jak w moim przykładzie użyj funkcji zanikania i zanikania jquery) x == 2? $ (element) .fadeIn(): $ (element) .fadeIn(); Nie jest wymagane posiadanie zmiennej zwracanej (np. Var y w pierwszym kodzie). – Prageeth

+1

musisz użyć potrójnych znaków "=", aby logika była idealna. jak w var y = (x === 2? "yes": "no"); – fino

+2

@fino Jest to prawdą techniczną, ale jeśli jest używana, gdy nie jest to bezwzględnie konieczne, '===' często powoduje więcej problemów niż rozwiązuje. Na przykład, czy naprawdę * chciałbyś, aby '2' pasował, ale nie" 2 "? JavaScript (i podobne języki) sprawiają, że łatwo nie dbać o to, który jest; na przykład, dane wprowadzane przez użytkownika z pola tekstowego będą ciągiem znaków i mogą być porównywane z liczbą-2 z '==' bez konwersji. '===' spowodowałoby tam problem. – Nicole

48

Inna opcja:

x === 2 ? doSomething() : void 0; 
+2

Jeśli ktoś nie wie, dlaczego użyć void 0, sugeruję przeczytać [link] (https://stackoverflow.com/questions/7452341/what-does-void-0-mean) – Carlinhos

4

Maleńki dodatek do tego bardzo, bardzo starego wątku ..

Powiedzmy your'e wewnątrz for pętli i trzeba oceniać zmienną o wartości truthy/falsy z operatorem potrójnego, podczas gdy w przypadku jest to falsy chcesz continue - będziesz mieć problem, bo ty jesteś nie Zwracanie Wyrażenie, zamiast tego zwracana jest instrukcja bez żadnej wartości.

To będzie produkować Uncaught SyntaxError: Unexpected token continue

for (var i = 0; i < myArray.length; i++) { 
     myArray[i].value ? alert('yay') : continue; 
} 

Tak więc, jeśli chcesz, aby powrócić oświadczenie i nadal korzystać z jednego wiersza do kodu, choć może się to wydawać trochę dziwne na pierwszy rzut oka i nie może postępować ściśle użycie języka można to zrobić w zamian:

for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i].value) alert('yay') ; else continue; 
    } 
  • PS - Kod ten może być trudny do odczytania lub zrozumieć, więc nie zawsze będzie najlepszym rozwiązaniem, aby użyć. Po prostu mówiąc .. :)