Soru Bir javascript, birden fazla koşulu olan ifadeyi test ediyor mu?


Javascript'te, test etmek için birden fazla koşulu olan bir if ifadesi kullanıldığında, javascript bunların tümünü sınava tabi tutar mı, yoksa zaten yanlışsa hepsini test etmeden önce mi kefalet eder?

Örneğin:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

Bu koşulların 3'ü için javascript testi veya b'nin 1'e eşit olmadığını ve bu nedenle yanlış olduğunu gördükten sonra ifadeden çıkacak mıdır?

Performans açısından soruyorum. Örneğin, eğer 3 karmaşık jQuery seçiciyi test edersem, jQuery'yi FALSE döndürecek ilkinden anlaşılırsa DOM 3 katını geçirmemeyi tercih ederim. (Bu durumda, ifadeler varsa 3 numaralı yuvaya daha mantıklı gelir).

ADDENDUM: Bir meraktan daha fazlası, bunun için uygun terim nedir? Birçoğunuzun 'kısa devre' terimini kullandığınızı görüyorum. Ayrıca, bazı diller bunu yapar ve diğerleri yapmaz mı?


76
2017-12-18 20:26


Menşei


@Josh: Bunun mikro optimizasyon olduğu fikrini tamamen takdir ediyorum. Hangisini bilmek güzel. Bir seçenek diğerine göre daha iyi hale getirilirse, söz konusu yöntemi kullanmanın alışkanlığını bilmek ve bilmek güzel olduğunu varsayalım. (Ayrıca, cevabın yanı sıra gerçekten çok merak ettim) - DA.
Kesinlikle, bu erken bir optimizasyon değil. Kısa devre mantığı olan dillerde, bazı yöntemlerin hangi koşullarda yürütülmeyeceğini bilmek önemlidir; Örneğin, yan etkilerine güveniyorsanız. - Rob
İşte "kısa devre değerlendirmesi" hakkında başka bir soru: stackoverflow.com/questions/1232603/... - David
@ David. Teşekkürler! İlginç okumalar. - DA.


Cevaplar:


&& operatör "kısa devreler" - yani, eğer sol koşul yanlışsa, doğru olanı değerlendirmekten rahatsız olmaz.

Benzer şekilde, || Sol durum doğruysa operatör kısa devreleri.

DÜZENLEME: Yine de, kıyaslama yapana ve bunun bir problem olduğunu belirleyene kadar performans konusunda endişelenmemelisiniz. Prematüre mikro optimizasyon, sürdürülebilirliğin bir parçasıdır.


112
2017-12-18 20:28



Mükemmel cevap (hem teknik hem de yönetim sorunu). Teşekkürler! - DA.
Eğer boolean statüsünün tüm bölümlerini yürütmek istiyorsanız, & & | ve ya da tekrarlı olarak - Zoidberg
Bu durum mutlaka her zaman performansla ilgili değildir. Bazen, boş bir kontrol yapıyor olabilirsiniz ve null kontrolünüzün koşulu olup olmadığını söylerseniz ve ikinci kontrolünüz için bir (b == value + 1) yapmayı denediğinizde, koşullar kontrol edilmişse, her üç koşulda da bir hata alırsınız. - infocyde
Aslında, kısa devre performansla ilgili değildir. Ancak asıl soru, performans açısından soruyordu. - Anon.
çok iyi. Bu tür mikro optimizasyonların (diğerleri arasında) bir kaydırma olayı döngüsünde büyük bir etkisi olabilir, örneğin birden fazla elemanın paralaks hesaplaması için veya hatta yapışkan çubuk için söylenebilir. Bunu al: if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop) İkinci koşul daha pahalı bir hesaplamadır, ilki sadece bir boole. :) - antoni


Performans açısından, bu bir mikro optimizasyon değildir.

3 Boole değişkeni varsa, a, b, c bir mikro optimizasyon.

Boolean değişkenlerini döndüren 3 işlevi çağırırsak, her bir işlev uzun sürebilir ve yalnızca bu kısa devreleri bilmek önemli değildir, aynı zamanda hangi sırayla. Örneğin:

if (takesSeconds () && takesMinutes ())

çok daha iyi

if (takesMinutes () && takesSeconds ())

eğer ikisi de eşit olarak yanlış geri dönüyorsa.


11
2017-12-18 21:21





Bu yüzden javascript kodu gibi yapabilirsiniz

var x = x || 2;

Hangi x tanımlanmamışsa ya da 'yanlış' ise, o zaman varsayılan değer 2 olur.


9
2017-12-18 20:32



JS kısa devre değerlendirmesini desteklemese bile bu işe yarayabilir. - p.s.w.g
Bu bir üçlü denk mi? - Mark Carpenter Jr


Birisi eğer bir yolu olup olmadığını merak ediyorsa değerlendirmeyi zorlamak her koşulda, bazı durumlarda bitsel operatörler & ve | kullanılabilir

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

Bunlar kullanılmalı gerçekten dikkatli bitsel işleçler, işlenenlerinin tek bitlerinde çalışan aritmetik işleçlerdir ve her zaman "kısa devre dışı" olarak çalışamazlar. && ve || 

Örnek:

-2147483648 && 1 = 1 

fakat

-2147483648 & 1 = 0

Umarım buraya (benim gibi) bu gibi bilgileri arayan birisine yardım eder ve düzeltme ve karşı örnek için @Max sayesinde


9
2017-09-21 10:33



Bu cevap yanlış. & ve | bitsel işleçlerdir, 'kısa devre' ve 've' olmayan komutlardır. Bitsel operatörler, işlenenlerinin tek bitlerinde çalışan aritmetik işleçlerdir. Örnek: -2147483648 && 1 = 1 ancak -2147483648 & 1 = 0. Daha fazla bilgi burada: en.wikipedia.org/wiki/Bitwise_operation - Max
@Max aslında ben bunu bilmiyordum, ben bu yana (ben şimdi "hile" diyoruz) bunu kullanıyorum çünkü ben C okuyordum. Neyse ki kodumu kırmak olurdu bu tür girdiler hiç gelmedi. Cevabımı düzelttim, sana borçluyum - ivcandela
cevabı düzeltmek için teşekkürler :-) - Max
@DJDaveMark üzgünüm ben senin false && (alert("")) işe çözüm: / - ivcandela
@ivcandela Ben de yapamazdım Eğer telefonumda olmasaydım, 1'i test ederdim; o) Yorum yapamayacağınız acıma. Az önce sildim ve aşağıdan bir tane daha ekledim - DJDaveMark


İlk koşulların doğru olup olmadığını sadece tüm koşulları test eder, kendiniz için test edin:

javascript: alert (false && alert("A") && false);

7
2017-12-18 20:29





Kısa devreler - örneğinizde sadece a ve b karşılaştırılacaktır.


3
2017-12-18 20:29





B'nin bir eşit olmadığını gördükten sonra çıkar.


2
2017-12-18 20:28





Soldaki 1 veya daha fazla parametre ile değerlendirmeyi durdurmanın bir başka nedeni.

if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) { ... }

ikinci değerlendirme, doğru olanı esas alır ve eğer ilk koşul başarısız olduğu için response.authResponse boş veya tanımlanmamış vb. ise bir derleme hatası atar.

İlk günlerde diğer diller bu problemi yaşamıştı ve bence derleyicileri inşa etmenin standart bir yaklaşımı olduğunu düşünüyorum.


2
2018-05-07 00:50





Bu sorudaki herhangi biri için şaşkın çünkü bir kısa devre || bir ile birlikte ? operatör böyle:

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

Kısa devre kuralı çalışmıyor gibi görünüyor. Neden ikinci dönemin değerlendirmesini yapıyor? || İlk doğru olduğunda (doğru? 2: 3)? Yukarıdakiler eşdeğeri olduğu için, bir operasyon problemi sırasına dönüşüyor.

x = (1 || true) ? 2 : 3

ile || önce değerlendirildi ve ? ikinci değerlendirdi. Muhtemelen ne istiyorsun:

x = 1 || (true ? 2 : 3)


0
2017-09-12 04:06