Pernyataan tunggal baris JavaScript 'jika' - sintaks terbaik, alternatif ini?


201

Sudah jelas diletakkan, meskipun pendapat tidak kurang, bahwa kurung keriting yang berkelanjutan pada satu baris ifpernyataan tidak ideal untuk rawatan dan keterbacaan.

Tapi bagaimana dengan ini?

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

Ini bahkan lebih padat, dan jika diperluas, kurung keriting tidak akan dilupakan. Apakah ada masalah mencolok, dan jika tidak, apa pertimbangannya? Saya merasa itu masih sangat mudah dibaca, setidaknya sebanyak operator ternary. Sepertinya saya seperti operator ternary tidak disarankan karena keterbacaan, meskipun saya merasa bahwa kesimpulan itu tidak terlalu bulat.

Si kembar jahat dalam diri saya ingin menyarankan ini, meskipun sintaksnya jelas tidak dimaksudkan untuk itu, dan mungkin hanya ide yang buruk.

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

2
Alangkah baiknya jika JavaScript mendukung persyaratan frase:document.write("My evil twin emerges") if lemons
Beau Smith

7
Saya pikir Anda mungkin berpikir tentang pendek jika, pernyataan lain. ( variable = (condition) ? true-value : false-value;.) Semoga berhasil.
Progo

Jawaban:


328

Saya telah melihat perilaku hubungan arus pendek dari &&operator yang digunakan untuk mencapai hal ini, meskipun orang yang tidak terbiasa dengan hal ini mungkin merasa sulit untuk membaca atau bahkan menyebutnya sebagai anti-pola:

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

Secara pribadi, saya akan sering menggunakan single-line iftanpa tanda kurung, seperti ini:

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

Jika saya perlu menambahkan lebih banyak pernyataan, saya akan meletakkan pernyataan di baris berikutnya dan menambahkan tanda kurung. Karena IDE saya melakukan lekukan otomatis, keberatan rawatan pada praktik ini diperdebatkan.


11
Saya suka yang terakhir. Terima kasih atas masukan dan satu lagi alternatif kreatif pada yang pertama!
David Hobs

Anda harus tahu apa yang Anda harapkan, karena string kosong dan 0 adalah nilai falsy, itu akan gagal mengeksekusi pernyataan kedua
Orlando

1
Tentu saja, Anda bisa meletakkan pernyataan boolean yang lebih eksplisit di sana
acjay

7
@PeterOlson mengapa keberatan rawatan dipertahankan? Bagaimana jika ada pengembang lain yang tidak menggunakan IDE Anda dengan konfigurasinya.
agconti

2
Terima kasih telah cukup berani untuk berbicara mendukung satu baris jika pernyataan tanpa tanda kurung. Suatu hari anak-anak kita akan berterima kasih.
Marc M.

136

Saya menggunakannya seperti ini:

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

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

43

Anda bisa menggunakan format ini, yang biasa digunakan dalam PHP:

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

12
Anda tidak perlu tanda kurung di lemon.
leymannx

6
Dapat menjadi praktik terbaik untuk menyertakan () di sekitar pernyataan bersyarat - menghilangkan kebingungan tentang urutan operasi, dll. Untuk pengembang lain. Saya biasanya salah untuk menentukannya kecuali jika tidak ada cara bagi seseorang yang memenuhi syarat untuk menjadi bingung.
djvs

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

Saya suka tanda kurung karena saya menyiratkan paksaan boolean.
Daniel Sokolowski

18

Baris yang satu ini jauh lebih bersih.

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

Saya lebih memilih ini. semoga membantu seseorang


16

dapat menggunakan ini,

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

penjelasan: jika lemonsada maka beri sayaalert("please give me a lemonade") else alert("then give me a beer")


Solusi bagus
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

// Contoh sederhana lainnya

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

15
kenapa tidak sederhana saja .. var a = 11; alert(a === 10);?
ManuKaracho

@ ManuKaracho Saya sering melihat masalah ini ketika bekerja dengan pernyataan ternary. Saya mengerti OP mungkin baru saja mencoba untuk menulis yang sederhana tetapi merajalela dalam kode yang saya baca di tempat kerja.
adam-beck

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

@JoshWood peringatan akan mencetak boolean juga, jadi Anda bisa melakukan alert(a===10)seperti kata Manu.
Keith

12

Seperti yang dikatakan banyak orang, jika Anda mencari 1 baris aktual jika:

    if (Boolean_expression) do.something();

lebih disukai. Namun, jika Anda ingin melakukan if / else maka ternary adalah teman Anda (dan juga sangat keren):

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

JUGA:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Namun, saya melihat satu contoh yang sangat keren. Teriak ke @ Peter-Oslson untuk &&

    (Boolean_expression) && do.something();

Terakhir, ini bukan pernyataan if tetapi mengeksekusi hal-hal dalam satu lingkaran dengan peta / perkecil atau Promise.resolve () juga menyenangkan. Teriak ke @brunettdan


7

Seperti yang telah dinyatakan, Anda dapat menggunakan:

&& gaya

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

atau

gaya tanpa braket

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

kembali korsleting

Namun, jika Anda ingin menggunakan pernyataan satu baris ifuntuk membuat hubungan pendek suatu fungsi, Anda harus menggunakan versi tanpa bracket seperti:

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

sebagai

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

akan memberi Anda SyntaxError: Unexpected keyword 'return'


Dalam hubung singkat jalur tunggal, kita dapat menghilangkan 'kembali' dan seharusnya berfungsi seperti yang diharapkan. `` `lemon &&" foo memberi saya bilah "; // bekerja! `` `
siwalikm

@siwalikm bisa Anda jelaskan? Ini untuk kasus di mana Anda tidak ingin kembali lemons(jika itu palsu) - Anda hanya ingin mengembalikan "foo beri saya bar" ketika lemonsbenar.
Marc

jika (lemon) kembali "foo beri saya bar"; ini salah. Ini akan memberi Anda "Sintaks UncaughtError: pernyataan kembali ilegal"
Fenec

@ Fenec akankah Anda membagikan peramban dan versi yang menyebabkan Anda mengalami kesalahan ini? Ini bekerja untuk saya hampir 2 tahun yang lalu dan terus bekerja untuk saya.
Marc

4

Saya telah melihat banyak jawaban dengan banyak suara menganjurkan menggunakan operator ternary. Terner sangat bagus jika a) Anda memiliki opsi alternatif dan b) Anda mengembalikan nilai yang cukup sederhana dari kondisi sederhana. Tapi...

Pertanyaan awal tidak memiliki alternatif, dan operator ternary dengan hanya satu cabang (nyata) memaksa Anda untuk mengembalikan jawaban yang dikoneksikan.

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

Saya pikir variasi yang paling umum adalah lemons ? 'foo...' : '', dan, seperti yang Anda tahu dari membaca segudang artikel untuk bahasa apa pun tentang benar, salah, jujur, palsu, null, nihil, kosong, kosong (dengan tanpa kami?), Anda memasukkan ladang ranjau (meskipun ranjau yang didokumentasikan dengan baik.)

Begitu bagian manapun dari terner menjadi rumit, Anda lebih baik dengan bentuk kondisional yang lebih eksplisit.

Jauh untuk mengatakan bahwa saya memilih if (lemons) "foo".


2

Itu juga dapat dilakukan dengan menggunakan satu baris dengan whileloop dan ifseperti ini:

if (blah)
    doThis();

Ini juga berfungsi dengan whileloop.


7
Ini akan gagal menyintesis dan tidak direkomendasikan
danwellman

9
OP juga meminta satu garis.
aaron-coding

2

Contoh dalam fungsi panah:

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

Dalam janji:

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

Jika tidak:

if(somethingTrue) thenDo()

Jika itu hanya sebuah syarat sederhana, saya lebih suka menggunakan if (nilai) kapan pun dimungkinkan karena kata if di awal pernyataan mengatakan lebih banyak tentang apa yang terjadi daripada paranthesis dan tanda tanya.


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

Bahkan menetapkan operasi juga bisa kita lakukan dengan kurung bulat

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

"Bahkan menetapkan operasi juga bisa kita lakukan dengan kurung bulat". Ini sangat menarik, saya tidak tahu bahwa itu mungkin untuk melakukan operasi penetapan di dalam operasi single-line ini.
sagits
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.