Saya ingin tahu apakah JavaScript memiliki evaluasi "sirkuit pendek" seperti && Operator di C #. Jika tidak, saya ingin tahu apakah ada solusi yang masuk akal untuk diterapkan.
javascript
short-circuiting
GibboK
sumber
sumber
https://www.google.com/search?q=site:stackoverflow.com+%s
sebagai pintasan pencarian (Chrome / Firefox) untuk mempercepat pencarian.Jawaban:
Ya, JavaScript memiliki evaluasi "sirkuit pendek".
DEMO langsung
DEMO langsung
sumber
Short-circuit
dengan operator logika itu. Coba saja sendiri. Gunakan demo saya.Jawaban ini sangat rinci tentang caranya korsletingberfungsi dalam JavaScript, dengan semua gotcha dan juga tema yang relevan seperti prioritas operator, jika Anda mencari definisi cepat dan sudah memahami cara kerja korsleting, saya sarankan untuk memeriksa jawaban lain.
Apa yang kami (pikir kami) ketahui sejauh ini:
Pertama mari kita periksa perilaku yang kita semua kenal, di dalam
if()
blok, tempat kita gunakan&&
untuk memeriksa apakah dua hal itutrue
:Sekarang, naluri pertama Anda mungkin mengatakan: 'Ah ya, cukup sederhana, kode menjalankan pernyataan jika keduanya
expr1
danexpr2
dievaluasi sebagaitrue
'Ya dan tidak. Anda secara teknis benar, itu adalah perilaku yang Anda jelaskan, tetapi itu bukanlah cara yang tepat untuk mengevaluasi kode dan kami perlu mempelajari lebih dalam untuk memahami sepenuhnya.
Bagaimana tepatnya
&&
dan||
ditafsirkan ?:Saatnya untuk melihat "di bawah tenda javascript mesin ". Mari pertimbangkan contoh praktis ini:
Nah hasilnya
260
.. tapi kenapa? Untuk mendapatkan jawabannya, kita perlu memahami cara kerja evaluasi hubung singkat.Jadi ini berarti, dalam contoh praktis kita,
const res
dievaluasi dengan cara berikut:expr1
-sanitise(0xFF)
0xFF
adalah bilangan heksadesimal yang valid untuk 250, jika tidak, saya akan kembaliNaN
expr1
kembali sebuah "truthy" nilai, waktu untuk mengeksekusiexpr2
(jika tidak saya akan berhenti sebagaiNaN
adalah falsy)userinput
adalah truthy (nomor), saya dapat menambahkan+5
untuk ituJadi di sini, kami dapat menghindari
if
pemblokiran tambahan danisNaN
pemeriksaan lebih lanjut dengan penggunaan&&
operator yang sederhana.Bagaimana cara kerjanya:
Sekarang, setidaknya kita harus memiliki gambaran bagaimana korsletingoperator bekerja. Aturan universal berjalan:
(some falsy expression) && expr
akan dievaluasi menjadi ekspresi yang salah(some truthy expression) || expr
akan mengevaluasi ekspresi kebenaranBerikut beberapa contoh lebih lanjut untuk pemahaman yang lebih baik:
Satu hal terakhir yang mengganggu, tetapi sangat penting [Operator Precedence]:
Bagus, semoga Anda menguasainya! Hal terakhir yang perlu kita ketahui adalah aturan tentang prioritas operator, yaitu:
&&
operator selalu dilaksanakan sebelum||
operator.Perhatikan contoh berikut:
Ini akan kembali sebagai, mungkin membingungkan bagi beberapa orang sebagai
a()
. Alasannya cukup sederhana, hanya penglihatan kita yang menipu kita, karena kita terbiasa membaca kiri-ke-kanan. Mari kita ambilconsole.log()
dan apa yang tidak keluar dan fokus murni pada evaluasiSekarang untuk membungkus kepala Anda di sekitar ini:
Kami mengatakan
&&
operator itu diutamakan, jadi dievaluasi sebagai yang pertama. Untuk membantu kami membayangkan evaluasi dengan lebih baik, pikirkan definisinyaDimana:
expr2
adalahfalse
expr1
adalahtrue || false
Jadi itu bagian yang sulit, sekarang
true || false
dievaluasi (expr1
- sisi kiri&&
).||
Operator berhenti eksekusi jikaexpr1 || expr2
diexpr1
mengevaluasi sebagai truthy, yangexpr1
dijalankan dan eksekusi kode berhenti.Nilai yang dikembalikan adalah
true
Yah .. itu cukup rumit, semua karena sedikit aturan dan semantik yang aneh. Tapi ingat, Anda selalu dapat menghindari prioritas operator dengan
()
- seperti dalam matematikasumber
expr1
danexpr2
ataucondition1
atau apapun, itu hanya membingungkan. Tentukan salah satunya, Anda juga bisa memasukkan variabel lokal, misalnya.const expr1 = true; if(expr1 && ...)