Menghilangkan ekspresi kedua saat menggunakan singkatan if-else

290

Bisakah saya menulis if elsesteno tanpa else?

var x=1;

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

Saya perhatikan meletakkan nulluntuk yang lain bekerja (tapi saya tidak tahu mengapa atau jika itu ide yang bagus).

Sunting: Beberapa dari Anda tampaknya bingung mengapa saya repot-repot mencoba ini. Yakinlah itu murni karena penasaran. Saya suka bermain-main dengan JavaScript.

Nikki
sumber
Saya pikir ada var | varsintaks. Hati-hati karena berpotensi sulit untuk "melihat", terutama (IMO) yang bermasalah. Gunakan hemat.
Jared Farrish
@JaredFarrish Bukankah seluruh titik terner yang lebih mudah mereka "lihat" daripada menggunakan pernyataan if? Juga apa sintaks yang Anda bicarakan, itu terlihat menarik.
Hassan
1
Tidak, saya pikir mereka tidak mudah sama sekali dalam semua kasus. "Seluruh poin" dalam pikiran saya adalah meletakkan semuanya pada satu baris ("kode saya lebih pendek dari milik Anda") atau untuk kasus-kasus spesifik dan literal dengan hasil yang sederhana. Susun terner sangat merusak dan harus dihindari dengan cara apa pun. :)
Jared Farrish
1
@Hassan - Saya pernah melihat sesuatu seperti foo = bar | cat;, di mana jika yang pertama salah? null ?, itu "jatuh" ke yang kedua. Saya hanya melihatnya, dan tidak menggunakannya.
Jared Farrish
3
@JaredFarrish: Itu a || batau a && b, kalau tidak, bakan selalu dievaluasi.
kennytm

Jawaban:

263

Ini juga merupakan opsi:

x==2 && dosomething();

dosomething()hanya akan dipanggil jika x==2dievaluasi true. Ini disebut hubungan arus pendek .

Ini tidak umum digunakan dalam kasus seperti ini dan Anda benar-benar tidak boleh menulis kode seperti ini. Saya mendorong pendekatan yang lebih sederhana ini:

if(x==2) dosomething();

Anda harus menulis kode yang dapat dibaca setiap saat; jika Anda khawatir tentang ukuran file, buat saja versi yang diperkecil dengan bantuan salah satu dari banyak kompresor JS. (mis. Penyusun Penutupan Google )

ajax333221
sumber
10
Oh, korsleting, benar. Pembacaan kode kurang dihargai, saya pikir di sebagian besar pengembang menengah dan beberapa "profesional berpengalaman".
Jared Farrish
2
Secara teknis Anda tidak perlu kawat gigi: if (1 - 1 === 0) $('.woot').text('Woot!'); Saya menggunakan formulir itu sepanjang waktu dengan PHP, dan sekarang saya mengadopsi Coffeescript, saya menggunakannya dalam Javascript saya juga.
be hollenbeck
5
Saya pribadi percaya jika ini kecil jika dengan satu hasil jika benar .. lebih cepat dan lebih mudah untuk menulis x == 2 && dosomething ();
Dean Meehan
9
if x==2 && doSomething() || doSomethingElse()
Agustín
1
Saya berharap JavaScript termasuk sintaks Ruby-seperti ini: doSomething() if x === 2. Saya tidak merindukan Ruby, tetapi saya merindukannya.
Chad Johnson
743

Apa yang Anda miliki adalah penggunaan operator ternary yang tidak biasa . Biasanya digunakan sebagai ekspresi, bukan pernyataan, di dalam beberapa operasi lain, misalnya:

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

Jadi, untuk keterbacaan (karena apa yang Anda lakukan tidak biasa), dan karena itu menghindari "yang lain" yang tidak Anda inginkan, saya akan menyarankan:

if (x==2) doSomething();
Nicole
sumber
Di sini kita dapat menambahkan garis finishing yang dimasukkan sebagai perintah penuh (seperti contoh saya menggunakan fungsi jquery fade in dan fade out) x == 2? $ (element) .fadeIn (): $ (element) .fadeIn (); Itu tidak wajib untuk memiliki variabel kembali (seperti var y dalam kode pertama).
Prageeth godage
1
Anda harus menggunakan tiga tanda "=" agar logika menjadi sempurna. seperti pada var y = (x === 2? "ya": "tidak");
fino
63

Pilihan lain:

x === 2 ? doSomething() : void 0;
Buzina
sumber
3
Jika seseorang tidak tahu mengapa menggunakan void 0 saya sarankan baca tautan
Carlinhos
20

Jika Anda tidak melakukan hal lain, mengapa tidak melakukannya:

if (x==2) doSomething();
Prescott
sumber
4
Anda dapat melakukannya bahkan jika Anda melakukannya
nmirceac
14

Menggunakan nulltidak masalah untuk salah satu cabang dari ekspresi ternary. Dan ekspresi ternary baik-baik saja sebagai pernyataan dalam Javascript.

Sebagai masalah gaya, meskipun, jika Anda berpikir untuk mengajukan suatu prosedur, lebih jelas untuk menulis ini menggunakan if..else:

if (x==2) doSomething;
else doSomethingElse

atau, dalam kasus Anda,

if (x==2) doSomething;
Ted Hopp
sumber
6

Tambahan kecil untuk utas yang sangat lama ini ..

Jika Anda mengevaluasi ekspresi di dalam for/ whileloop dengan operator ternary, dan ingin continueatau breaksebagai hasilnya - Anda akan memiliki masalah karena keduanya continue& breakbukan ekspresi , itu pernyataan tanpa nilai.

Ini akan menghasilkan Uncaught SyntaxError: Unexpected token continue

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

Jika Anda benar-benar menginginkan satu baris yang mengembalikan pernyataan, Anda dapat menggunakan ini sebagai gantinya:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Kode ini mungkin menaikkan alis. Hanya mengatakan .. :)
DotBot
sumber
4

Secara teknis, meletakkan nol atau 0, atau hanya beberapa nilai acak di sana berfungsi (karena Anda tidak menggunakan nilai balik). Namun, mengapa Anda menggunakan konstruk ini alih-alih ifkonstruk? Tidak terlalu jelas apa yang Anda coba lakukan ketika Anda menulis kode dengan cara ini, karena Anda dapat membingungkan orang dengan no-op (nol dalam kasus Anda).

nhahtdh
sumber
2

Mungkin terpendek (berdasarkan operator OR dan prioritasnya )

x-2||dosomething()

Kamil Kiełczewski
sumber