JavaScript tek satır 'if' deyimi - en iyi sözdizimi, bu alternatif?


204

Açıkçası, ne kadar az da olsa, tek satırlık bir ififadede ilerleyen kıvırcık parantezlerin sürdürülebilirlik ve okunabilirlik için ideal olmadığı açıkça belirtilmiştir.

Peki buna ne dersiniz?

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

Daha da sıkıştırılmış ve genişletilmişse, kıvrımlı parantezler unutulmayacak. Herhangi bir açık problem var mı, yoksa dikkate alınması gerekenler nelerdir? Hâlâ okunabilir gibi hissediyorum, en azından üçlü bir operatör kadar. Bana öyle geliyor ki üçlülük operatörleri okunabilirlik nedeniyle o kadar fazla önerilmiyor, ancak bu sonucun oybirliğiyle olmadığını düşünüyorum.

İçimdeki kötü ikiz bunu önermek istiyor, ancak sözdizimi açıkça bunun için tasarlanmamıştır ve muhtemelen sadece kötü bir fikirdir.

(syntax) ? document.write("My evil twin emerges"): "";

2
JavaScript cümle koşullarını destekliyorsa iyi olur:document.write("My evil twin emerges") if lemons
Beau Smith

7
Sanırım kısa if, else ifadesini düşünüyor olabilirsiniz. ( variable = (condition) ? true-value : false-value;.) İyi şanslar.
Progo

Yanıtlar:


332

Bunu &&başarmak için kullanılan operatörün kısa devre davranışını gördüm , ancak buna alışkın olmayan insanlar okumak zor, hatta anti-desen olarak adlandırılabilir:

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

Şahsen, genellikle tek satırlık ifparantez olmadan kullanacağım , şöyle:

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

Daha fazla ifade eklemem gerekirse, ifadeleri bir sonraki satıra koyacağım ve parantez ekleyeceğim. IDE'm otomatik girinti yaptığından, bu uygulamaya yönelik sürdürülebilirlik itirazları tartışmalıdır.


11
İkincisini seviyorum. Giriş için teşekkürler ve ilkinde bir tane daha yaratıcı alternatif!
David Hobs

ne beklediğinizi bilmelisiniz, boş dize ve 0 yanlış değerler olduğundan, ikinci ifadeyi yürütmede başarısız olur
Orlando

1
Tabii ki, orada daha açık bir boole ifadesi de
ekleyebilirsiniz

7
@PeterOlson sürdürülebilirlik itirazları neden tartışılıyor? Başka bir geliştirici IDE'nizi yapılandırmasıyla kullanmazsa ne olur?
agconti

2
Parantezsiz ifadeler varsa tek satırlık desteği destekleyecek kadar cesur olduğunuz için teşekkür ederiz. Bir gün çocuklarımız size teşekkür edecek.
Marc

136

Ben böyle kullanın:

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

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

44

PHP'de yaygın olarak kullanılan bu biçimi kullanabilirsiniz:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

12
Üzerinde parantez gerekmez lemon.
leymannx

6
Koşullu bir ifadenin etrafına () dahil etmek en iyi uygulama olabilir - diğer geliştiriciler için işlem sırası vb. İle ilgili karışıklıkları ortadan kaldırır. Genellikle terbiyeli bir insanın kafası karışması için bir yol olmadığı sürece bunu belirtmeye yönelirim.
djvs

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh

Köşeli parantezleri seviyorum, çünkü onlar bir boole zorlaması ima ediyorlar.
Daniel Sokolowski

18

Bu tek satır çok daha temiz.

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

Bunu tercih ederim. umarım birine yardım eder


16

bunu kullanabilir,

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

açıklama: varsa lemonso zaman bana biralert("please give me a lemonade") else alert("then give me a beer")


Harika bir çözüm.
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

// Başka basit bir örnek

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
neden sadece .. var a = 11; alert(a === 10);?
ManuKaracho

@ManuKaracho Üçlü ifadelerle çalışırken bu sorunu çok görüyorum. Ben OP sadece basit bir yazmak için çalışıyor olabilir anlıyorum ama iş yerinde okuduğum kodda yaygın.
adam-beck

1
alert(a === 10 ? "true" : "false")
Josh Wood

@JoshWood uyarısı booleanları da yazdıracak, böylece Manu'un alert(a===10)söylediği gibi yapabilirsiniz .
Keith

13

Bir çok insanın dediği gibi, eğer gerçek bir 1 satır arıyorsanız:

    if (Boolean_expression) do.something();

tercih edilir. Bununla birlikte, eğer bir if / else yapmak istiyorsanız üçlü arkadaşınızdır (ve aynı zamanda süper havalı):

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

AYRICA:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Ancak çok güzel bir örnek gördüm. && için @ Peter-Oslson'a sesleniyor

    (Boolean_expression) && do.something();

Son olarak, bir if ifadesi değildir, ancak bir map / reduce veya Promise.resolve () ile bir döngüde bir şeyler yürütmek de eğlencelidir. @Brunettdan bağırır


7

Daha önce de belirtildiği gibi şunları kullanabilirsiniz:

&& tarzı

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

veya

köşesiz ayraç stili

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

kısa devre dönüşü

Bununla birlikte, ifbir işlevi kısa devre yapmak için tek satırlık ifadeyi kullanmak isterseniz, aşağıdaki gibi parantezsiz sürümle gitmeniz gerekir :

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

gibi

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

sana bir SyntaxError: Unexpected keyword 'return'


Tek hatlı kısa devrelerde, 'geri dönüşü' atlayabiliriz ve beklendiği gibi çalışması gerekir. `` limonlar && "foo bana bir bar verdi"; // İşler! ``
siwalikm

@siwalikm açıklayabilir misiniz? Bu, lemons( lemonsfalsey ise) geri dönmek istemediğiniz durum için - sadece doğru olduğunda "foo bana bar verdi" dönmek istiyorum .
Marc

(limon) "foo bana bir bar verdi" dönerse; Bu yanlış. Size "Yakalanmamış SyntaxError: Yasadışı iade beyanı"
verecektir

@Fenec, bu hataya neden olan tarayıcıyı ve sürümü paylaşır mısınız? Bu neredeyse 2 yıl önce benim için çalıştı ve benim için çalışmaya devam ediyor.
Marc

4

Üçlü operatörü kullanarak pek çok oyla birçok cevap gördüm. Üçlü, a) alternatif bir seçeneğiniz varsa ve b) basit bir koşuldan oldukça basit bir değer döndürüyorsanız harika. Fakat...

Orijinal sorunun bir alternatifi yoktu ve sadece tek (gerçek) bir şubeye sahip üçlü operatör sizi şaşkın bir cevap vermeye zorluyor.

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

En yaygın varyasyon olduğunu düşünüyorum ve lemons ? 'foo...' : ''doğru, yanlış, doğruluk, falsey, null, nil, boş, boş (bizim olmadan?) bir mayın tarlası (iyi belgelenmiş bir mayın tarlası da olsa)

Üçlünün herhangi bir kısmı karmaşıklaşır karşılaşmaz, daha açık bir koşullu formla daha iyi durumdasınız.

Oy verdiğimi söylemenin uzun bir yolu if (lemons) "foo".


2

Ayrıca whiledöngüler içeren tek bir satır kullanılarak da yapılabilir ve ifşöyle:

if (blah)
    doThis();

Ayrıca whiledöngülerle çalışır .


7
Bu linting başarısız olacak ve tavsiye edilmez
danwellman

9
OP ayrıca bir astar istedi.
aaron-kodlama

2

Ok fonksiyonlarına örnek:

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

Vaatlerde:

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

Aksi takdirde:

if(somethingTrue) thenDo()

Sadece basit bir koşullu varsa, ben kullanmayı tercih eğer (değer) mümkünse çünkü kelime eğer daha parantez ve QuestionMarks daha neler olduğu hakkında açıklamada başlangıcı diyor içinde.


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

Hatta atama işlemi de yuvarlak parantez ile yapabiliriz

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

"Hatta atama işlemi bile yuvarlak parantez ile yapabiliriz". Bu çok ilginç, bu tek hatlı operasyonlar içinde operasyon atamanın mümkün olduğunu bilmiyordum.
sarkmalar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.