Saya memiliki pernyataan kondisional yang sangat panjang seperti berikut:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
Saya bertanya-tanya apakah saya bisa mengubah ekspresi / pernyataan ini menjadi bentuk yang lebih ringkas.
Adakah cara untuk mencapai ini?
javascript
if-statement
Kucing Terbang
sumber
sumber
in
?||
. (2)switch
pernyataan. (3) regex. (4)~
. jsperf.com/if-statements-test-techsinJawaban:
Masukkan nilai Anda ke dalam array, dan periksa apakah item Anda ada di dalam array:
Jika browser yang Anda dukung tidak memiliki
Array#includes
metode, Anda dapat menggunakan polyfill ini .Penjelasan singkat tentang
~
pintasan tilde:Alih-alih memeriksa jika hasilnya dari
indexOf
adalah>= 0
, ada jalan pintas kecil yang menyenangkan:Ini biola: http://jsfiddle.net/HYJvK/
Bagaimana cara kerjanya? Jika item ditemukan dalam array,
indexOf
kembalikan indeksnya. Jika item itu tidak ditemukan, itu akan kembali-1
. Tanpa terlalu banyak detail,~
ini adalah operator BUKAN bitwise , yang0
hanya akan kembali untuk-1
.Saya suka menggunakan jalan
~
pintas, karena lebih ringkas daripada melakukan perbandingan pada nilai kembali. Saya berharap JavaScript akan memilikiin_array
fungsi yang mengembalikan Boolean secara langsung (mirip dengan PHP), tapi itu hanya angan-angan ( Pembaruan: sekarang. Ini disebutincludes
. Lihat di atas). Perhatikan bahwa jQuery'sinArray
, saat membagikan tanda tangan metode PHP, sebenarnya meniruindexOf
fungsionalitas asli (yang berguna dalam kasus yang berbeda, jika indeksnya benar-benar setelah Anda).Catatan penting: Menggunakan pintasan tilde tampaknya dibalut kontroversi, karena beberapa orang sangat percaya bahwa kode tidak cukup jelas dan harus dihindari dengan cara apa pun (lihat komentar pada jawaban ini). Jika Anda berbagi sentimen mereka, Anda harus tetap berpegang pada
.indexOf(...) >= 0
solusinya.Penjelasan lebih lama:
Integer dalam JavaScript ditandatangani, yang berarti bahwa bit paling kiri dicadangkan sebagai bit tanda; sebuah bendera untuk menunjukkan apakah angka itu positif atau negatif, dengan
1
yang negatif.Berikut adalah beberapa contoh angka positif dalam format biner 32-bit:
Sekarang ini adalah angka-angka yang sama, tetapi negatif:
Mengapa kombinasi aneh seperti itu untuk angka negatif? Sederhana. Angka negatif hanyalah kebalikan dari angka positif +1; menambahkan angka negatif ke angka positif harus selalu menghasilkan
0
.Untuk memahami ini, mari kita lakukan aritmatika biner sederhana.
Berikut adalah bagaimana kita akan menambahkan
-1
ke+1
:Dan di sini adalah bagaimana kita akan menambahkan
-15
ke+15
:Bagaimana kita mendapatkan hasil itu? Dengan melakukan penambahan reguler, cara kami diajarkan di sekolah: Anda mulai di kolom paling kanan, dan Anda menambahkan semua baris. Jika jumlahnya lebih besar dari angka satu digit terbesar (yang dalam desimal
9
, tetapi dalam biner1
), kami membawa sisanya ke kolom berikutnya.Sekarang, seperti yang akan Anda perhatikan, ketika menambahkan angka negatif ke angka positifnya, kolom paling kanan yang tidak semua
0
s akan selalu memiliki dua1
s, yang bila ditambahkan bersama akan menghasilkan2
. Representasi biner dari dua wujud10
, kita bawa1
ke kolom berikutnya, dan beri0
hasil pada kolom pertama. Semua kolom lain di sebelah kiri hanya memiliki satu baris dengan1
, sehingga yang1
terbawa dari kolom sebelumnya akan bertambah lagi2
, yang kemudian akan terbawa ... Proses ini berulang sampai kita sampai ke kolom paling kiri, di mana yang1
akan dibawa ke mana-mana, sehingga meluap dan hilang, dan kami pergi dengan0
s di seluruh.Sistem ini disebut 2's Complement . Anda dapat membaca lebih lanjut tentang ini di sini:
Representasi Pelengkap 2 untuk Integer yang Ditandatangani .
Sekarang kursus kilat di komplemen 2 sudah berakhir, Anda akan melihat bahwa
-1
hanya nomor yang representasi binernya ada1
di seluruh.Menggunakan
~
operator bitwise NOT, semua bit dalam jumlah yang diberikan dibalik. Satu - satunya cara untuk0
kembali dari membalikkan semua bit adalah jika kita mulai dengan1
semua.Jadi, semua ini adalah cara yang panjang lebar untuk mengatakan bahwa
~n
hanya akan kembali0
jikan
ada-1
.sumber
!== -1
cara apa pun yang mungkin? Bukankah logika boolean eksplisit lebih tepat daripada secara implisit menggunakan kepalsuan nol?!= -1
.Anda dapat menggunakan pernyataan beralih dengan jatuh melalui:
sumber
||
) di Chrome. Lihat jsperf.com/if-statements-test-techsinMenggunakan Ilmu: Anda harus melakukan apa yang idfah katakan dan ini untuk kecepatan tercepat sambil menjaga kode pendek:
INI LEBIH CEPAT DARI
~
METODEhttp://jsperf.com/if-statements-test-techsin (Perangkat teratas: Chrome, perangkat bawah: Firefox)
Kesimpulan:
Jika kemungkinan yang beberapa dan Anda tahu bahwa orang-orang tertentu lebih mungkin terjadi daripada yang Anda dapatkan performa maksimal
if ||
,switch fall through
, danif(obj[keyval])
.Jika kemungkinannya banyak , dan siapa pun di antara mereka yang paling mungkin terjadi, dengan kata lain, Anda tidak bisa tahu mana yang paling mungkin terjadi daripada Anda mendapatkan kinerja terbanyak dari pencarian objek
if(obj[keyval])
danregex
jika itu cocok.http://jsperf.com/if-statements-test-techsin/12
Saya akan memperbarui jika sesuatu yang baru muncul.
sumber
switch case
apakah metode tercepat?if ( ...||...||...)...
obj["itemX"]
sangat cepat jika n besar. Pada dasarnya, apa yang cepat tergantung pada konteks. Selamat bersenang-senang.Jika Anda membandingkan dengan string dan ada pola, pertimbangkan untuk menggunakan ekspresi reguler.
Kalau tidak, saya curiga mencoba memperpendeknya hanya akan mengaburkan kode Anda. Pertimbangkan hanya membungkus garis untuk membuatnya cantik.
sumber
(test.type == 'itemf' && foo.mode == 'detailed')
)Menggunakan objek sebagai array asosiatif adalah hal yang cukup umum, tetapi karena JavaScript tidak memiliki set asli, Anda dapat menggunakan objek sebagai set murah juga.
sumber
if
pernyataan @dcarson OP membutuhkan 78 karakter jika Anda menghapus semua spasi putih. Tambang membawa 54 jika Anda menulis seperti ini:test.type in {"itema":1,"itemb":1,"itemc":1,"itemd":1}
. Pada dasarnya, ia menggunakan empat karakter untuk setiap dua penggunaan tambang untuk setiap kunci tambahan.atau jika barangnya tidak seragam, maka:
sumber
Jawaban luar biasa, tetapi Anda dapat membuat kode jauh lebih mudah dibaca dengan membungkus salah satu dari mereka dalam suatu fungsi.
Ini rumit jika pernyataan, ketika Anda (atau orang lain) membaca kode dalam waktu bertahun-tahun, Anda akan memindai untuk menemukan bagian untuk memahami apa yang terjadi. Pernyataan dengan tingkat logika bisnis ini akan menyebabkan Anda tersandung selama beberapa detik saat Anda mengerjakan apa yang Anda uji. Sedangkan kode seperti ini, akan memungkinkan Anda untuk melanjutkan pemindaian.
Beri nama fungsi Anda secara eksplisit sehingga segera jelas apa yang Anda uji dan kode Anda akan lebih mudah dipindai dan dipahami.
sumber
// CheckIfBusinessRuleIsTrue
?Anda bisa memasukkan semua jawaban ke dalam Javascript Set dan kemudian panggil saja
.contains()
set tersebut.Anda masih harus mendeklarasikan semua konten, tetapi panggilan inline akan lebih pendek.
Sesuatu seperti:
sumber
Salah satu cara favorit saya untuk menyelesaikan ini adalah dengan perpustakaan seperti underscore.js ...
http://underscorejs.org/#some
sumber
contains
bisa dibilang solusi yang lebih baik daripadasome
some
adalah fungsi pada prototipe Array di EC5.cara lain atau cara luar biasa lain yang saya temukan adalah ini ...
tentu saja seperti yang Anda lihat ini membutuhkan beberapa langkah lebih maju dan membuatnya mudah mengikuti logika.
http://snook.ca/archives/javascript/testing_for_a_v
menggunakan operator seperti ~ && || ((), ()) ~~ tidak apa-apa hanya jika kode Anda rusak nanti. Anda tidak akan tahu harus mulai dari mana. Jadi keterbacaan itu BESAR.
jika harus, Anda bisa membuatnya lebih pendek.
dan jika Anda ingin melakukan invers
sumber
Cukup gunakan
switch
pernyataan alih-alihif
pernyataan:Switch
juga bekerja lebih cepat daripada membandingkan banyak persyaratan dalam sebuahif
sumber
Untuk daftar string yang sangat panjang, ide ini akan menghemat beberapa karakter (tidak mengatakan saya akan merekomendasikannya dalam kehidupan nyata, tetapi seharusnya berhasil).
Pilih karakter yang Anda tahu tidak akan muncul di test.type Anda, gunakan sebagai pembatas, tempel semuanya menjadi satu string panjang dan cari yang:
Jika string Anda semakin dibatasi, Anda bahkan dapat menghilangkan pembatas ...
... tetapi Anda harus berhati-hati terhadap kesalahan positif dalam kasus itu (mis. "embite" akan cocok dengan versi itu)
sumber
Agar mudah dibaca, buat fungsi untuk ujian (ya, fungsi satu baris):
lalu sebut itu:
sumber
Saya pikir ada 2 tujuan ketika menulis kondisi if ini.
Terkadang # 1 mungkin yang tercepat, tetapi saya akan mengambil # 2 untuk perawatan yang mudah nanti. Bergantung pada skenario, saya akan sering memilih variasi jawaban Walter.
Untuk memulai, saya memiliki fungsi yang tersedia secara global sebagai bagian dari perpustakaan saya yang ada.
dan kemudian ketika saya benar-benar ingin menjalankan jika kondisi mirip dengan Anda, saya akan membuat objek dengan daftar nilai yang valid:
Ini tidak secepat pernyataan switch / case dan sedikit lebih bertele-tele daripada beberapa contoh lainnya, tetapi saya sering mendapatkan kembali penggunaan objek di tempat lain dalam kode yang bisa sangat berguna.
Membonceng pada salah satu sampel jsperf yang dibuat di atas saya menambahkan tes ini dan variasi untuk membandingkan kecepatan. http://jsperf.com/if-statements-test-techsin/6 Hal paling menarik yang saya catat adalah bahwa kombo pengujian tertentu di Firefox jauh lebih cepat daripada Chrome.
sumber
Ini dapat diselesaikan dengan simpel untuk loop:
Kami menggunakan bagian pertama loop for untuk menginisialisasi argumen yang ingin Anda cocokkan, bagian kedua untuk menghentikan loop for dari berjalan, dan bagian ketiga menyebabkan loop akhirnya keluar.
sumber