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.
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.
Jawaban:
Ya, JavaScript memiliki evaluasi "sirkuit pendek".
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
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.
Pertama mari kita periksa perilaku yang kita semua kenal, di dalam if()
blok, tempat kita gunakan &&
untuk memeriksa apakah dua hal itu true
:
if (true && true) {
console.log('bar');
}
Sekarang, naluri pertama Anda mungkin mengatakan: 'Ah ya, cukup sederhana, kode menjalankan pernyataan jika keduanya expr1
dan expr2
dievaluasi sebagai true
'
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.
&&
dan ||
ditafsirkan ?:Saatnya untuk melihat "di bawah tenda javascript mesin ". Mari pertimbangkan contoh praktis ini:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
Nah hasilnya 260
.. tapi kenapa? Untuk mendapatkan jawabannya, kita perlu memahami cara kerja evaluasi hubung singkat.
Menurut Definisi MDN ,
&&
operatorexpr1 && expr2
dijalankan sebagai berikut:Jika
expr1
dapat diubah menjaditrue
, kembaliexpr2
; lain, kembaliexpr1
.
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 kembali NaN
expr1
kembali sebuah "truthy" nilai, waktu untuk mengeksekusi expr2
(jika tidak saya akan berhenti sebagai NaN
adalah falsy)userinput
adalah truthy (nomor), saya dapat menambahkan +5
untuk ituJadi di sini, kami dapat menghindari if
pemblokiran tambahan dan isNaN
pemeriksaan lebih lanjut dengan penggunaan &&
operator yang sederhana.
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:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
Bagus, semoga Anda menguasainya! Hal terakhir yang perlu kita ketahui adalah aturan tentang prioritas operator, yaitu:
&&
operator selalu dilaksanakan sebelum ||
operator.Perhatikan contoh berikut:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
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 ambil console.log()
dan apa yang tidak keluar dan fokus murni pada evaluasi
true || false && false
Sekarang 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 definisinya
expr1 && expr2
Dimana:
expr2
adalah false
expr1
adalah true || false
Jadi itu bagian yang sulit, sekarang true || false
dievaluasi ( expr1
- sisi kiri &&
).
||
Operator berhenti eksekusi jika expr1 || expr2
di expr1
mengevaluasi sebagai truthy, yang expr1
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 matematika
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
dan expr2
atau condition1
atau apapun, itu hanya membingungkan. Tentukan salah satunya, Anda juga bisa memasukkan variabel lokal, misalnya. const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
sebagai pintasan pencarian (Chrome / Firefox) untuk mempercepat pencarian.