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-circuitdengan 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 expr1dan expr2dievaluasi 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 && expr2dijalankan sebagai berikut:Jika
expr1dapat diubah menjaditrue, kembaliexpr2; lain, kembaliexpr1.
Jadi ini berarti, dalam contoh praktis kita, const resdievaluasi dengan cara berikut:
expr1-sanitise(0xFF)0xFF adalah bilangan heksadesimal yang valid untuk 250, jika tidak, saya akan kembali NaNexpr1kembali sebuah "truthy" nilai, waktu untuk mengeksekusi expr2 (jika tidak saya akan berhenti sebagai NaNadalah falsy)userinputadalah truthy (nomor), saya dapat menambahkan +5untuk ituJadi di sini, kami dapat menghindari ifpemblokiran tambahan dan isNaNpemeriksaan 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 falseexpr1 adalah true || falseJadi itu bagian yang sulit, sekarang true || falsedievaluasi ( expr1- sisi kiri &&).
||Operator berhenti eksekusi jika expr1 || expr2di expr1mengevaluasi sebagai truthy, yang expr1dijalankan 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()
*/
expr1dan expr2 atau condition1atau 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+%ssebagai pintasan pencarian (Chrome / Firefox) untuk mempercepat pencarian.