Dalam javascript, ketika menggunakan pernyataan if dengan beberapa kondisi untuk diuji, apakah javascript menguji semuanya, atau apakah jaminan sebelum menguji semuanya jika sudah salah?
Sebagai contoh:
a = 1
b = 2
c = 1
if (a==1 && b==1 && c==1)
Akankah javascript menguji semua 3 kondisi tersebut atau, setelah melihat bahwa b tidak sama dengan 1, dan oleh karena itu salah, akankah itu keluar dari pernyataan?
Saya bertanya dari sudut pandang kinerja. Jika, misalnya, saya menguji 3 selektor jQuery kompleks, saya lebih suka jQuery tidak melintasi DOM 3 kali jika sudah jelas melalui yang pertama bahwa itu akan mengembalikan FALSE. (Dalam hal ini akan lebih masuk akal untuk menyarangkan 3 pernyataan if).
TAMBAHAN: Lebih ke penasaran, istilah apa yang tepat untuk ini? Saya perhatikan bahwa banyak dari Anda menggunakan istilah 'korsleting'. Juga, apakah beberapa bahasa melakukan ini dan yang lainnya tidak?
sumber
Jawaban:
The
&&
operator "sirkuit pendek" - yaitu, jika kondisi kiri adalah palsu, itu tidak mengganggu mengevaluasi yang tepat.Begitu pula dengan
||
operator korsleting jika kondisi kiri benar.EDIT: Padahal, Anda tidak perlu khawatir tentang kinerja sampai Anda mengukur dan menentukan bahwa itu masalah. Mikro-optimasi prematur adalah kutukan dari pemeliharaan.
sumber
if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)
kondisi kedua adalah perhitungan yang lebih mahal, yang pertama hanya boolean. :)Dari sudut pandang kinerja, ini bukan pengoptimalan mikro.
Jika kita memiliki 3 variabel Boolean, a, b, c itu adalah mikro-optimasi.
Jika kita memanggil 3 fungsi yang mengembalikan variabel Boolean, setiap fungsi mungkin membutuhkan waktu lama, dan tidak hanya penting untuk mengetahui hubung singkat ini, tetapi juga dalam urutannya. Sebagai contoh:
jauh lebih baik daripada
jika keduanya sama-sama cenderung mengembalikan false.
sumber
Itu sebabnya Anda bisa melakukannya dalam kode javascript seperti
Yang berarti jika x tidak ditentukan atau sebaliknya 'salah' maka nilai defaultnya adalah 2.
sumber
Jika seseorang bertanya-tanya apakah ada cara untuk memaksa evaluasi semua kondisi, dalam beberapa kasus operator bitwise
&
dan|
dapat digunakanIni harus digunakan dengan sangat hati-hati karena operator bitwise adalah operator aritmatika yang bekerja pada bit tunggal operan mereka dan tidak dapat selalu berfungsi sebagai versi "non-short-circuit" dari
&&
dan||
Contoh:
tapi
Semoga dapat membantu seseorang yang tiba di sini mencari informasi seperti ini (seperti saya) dan terima kasih kepada @Max atas koreksi dan contoh tandingannya.
sumber
false && (alert(""))
solusi Anda untuk bekerja: /var a=false; var b=check(); alert(a && b);
Ini hanya akan menguji semua kondisi jika yang pertama benar, ujilah sendiri:
sumber
Ini korsleting - hanya a dan b yang akan dibandingkan dalam contoh Anda.
sumber
Alasan lain mengapa menghentikan evaluasi dengan 1 atau lebih parameter di sebelah kiri.
if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) {...}
evaluasi kedua bergantung pada yang pertama benar dan tidak akan memunculkan kesalahan kompilasi jika response.authResponse adalah null atau tidak terdefinisi dll karena kondisi pertama gagal.
Bahasa lain memiliki masalah ini di masa-masa awal dan menurut saya ini adalah pendekatan standar dalam membangun kompiler sekarang.
sumber
Itu keluar setelah melihat bahwa b tidak sama dengan satu.
sumber
Bagi siapa pun yang memiliki pertanyaan ini bingung karena mereka tidak melihat perilaku hubung singkat saat menggunakan
||
dalam hubungannya dengan?
operator seperti:x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected
sepertinya aturan korsleting tidak berfungsi. Mengapa mengevaluasi suku kedua dari
||
(benar? 2: 3) ketika yang pertama benar? Ternyata ini adalah masalah urutan operasi karena persamaan di atas adalahx = (1 || true) ? 2 : 3
dengan
||
evaluasi pertama dan?
evaluasi kedua. Apa yang mungkin Anda inginkan adalah:x = 1 || (true ? 2 : 3)
sumber