(0 <5 <3) neden geri dönüyor?


348

Jsfiddle.net'te oynuyordum ve bunun neden doğru döndüğünü merak ediyorum?

if(0 < 5 < 3) {
    alert("True");
}

Bunu da yapar:

if(0 < 5 < 2) {
    alert("True");
}

Ancak bu şunları yapmaz:

if(0 < 5 < 1) {
    alert("True");
}

Bu tuhaflık hiç faydalı oldu mu?



1
Ha! Hayır, daha önce hiç görmemiştim.
punkrockbuddyholly

Ah, örtük tip dönüşümlerin sevinci.
Jörg W Mittag

4
Hiç faydalı oldu mu? Olasılık için muhtemelen. :-)
Icode4food

Neden? Ayrıca, yalnızca gerektiren koşulları bulabiliyorsanız her şey yararlıdır. Doğru, bu, diğerlerinden daha az sıklıkla gereklidir, ancak, tam olarak işin aracı olabileceği zamanlar, az ve çok arasında zamanlar vardır.
temporary_user_name

Yanıtlar:


440

İşlem sırası (0 < 5 < 3)javascript'te ((0 < 5) < 3)üretilen (true < 3)ve true olarak 1 olarak yorumlanır ve true olarak dönmesine neden olur.

Bu yüzden de (0 < 5 < 1) yanlış (0 < 5)döndürür, doğru döndürür 1, sonuç olarak yorumlanır (1 < 1).


158
Ve çünkü JavaScript Python DEĞİLDİR. :-)
rsenna

1
Ben eklemek için sorumu düzenlerken cevap verdiniz if(0 < 5 < 1) == false. Her şey şimdi açık, teşekkürler :)
punkrockbuddyholly

28
Tam olarak, Python, bu sözdizimini tedavi ettiği bildiğim tek dildir ((0 < 5) && (5 < 3)), muhtemelen başkaları da vardır, ancak onları bilmiyorum.
Alan Geleynse

18
@Alan: Mathematica başka bir örnektir.
Joren

2
IMHO JavaScript, mantıksal sayı ile karşılaştırmaya çalışırken TypeError değerini yükseltmelidir, çünkü mantıklı değildir.
Michał Perłakowski

63

Benim tahminim 0 < 5doğrudur ve gerçek olanı true < 3alır 1 < 3.


7
Burada döküm yok. Oyuncular, programcının bir türü açıkça kontrol etmek için kullandığı bir operatördür . Bu, bir boole'den tamsayıya örtük dönüşümdür.
erickson

4
@erickson, gerçekten ... burada anlambilime asılmamız gerekiyor mu?
CaffGeek

2
Erickson için endişelenme. Anlambilim kelimesini de yanlış kullanıyorum. :)
Mateen Ulhaq

9
Her durumda doğru terim baskıdır . Ve evet, erickson mutlak kesinlik ile kısmen yanlış. Herhangi bir durumda, genellikle (ancak bu sadece bir konvansiyon) açık tip dönüşümleri ifade etmek için "cast" kelimesini kullanırsanız, bir tür baskı da bir tür dökümdür. Dönüşümü yazın == Tür dökümü.
Jack

1
Tüm yol boyunca sofistler ... Cevap zaten 'laconically' güzel;)
Arman McHitarian

21

Muhtemelen çünkü trueolarak kabul edilir 1, böylece

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true


10

Sorunuza gelince, bu tuhaflık hiç yararlı olup olmadığını varsayalım: (eğer yoğun kod peşinde olduğunuz şeyse) yararlı olacağı bir durum olabilir, ancak ona güvenmek (büyük olasılıkla) kodunuzun anlaşılabilirliğini ciddi şekilde azaltacaktır.

Bu, daha büyük ifadelerin bir parçası olarak post / pre artış / azalışı kullanmak gibi bir şey. Bir bakışta bu kodun sonucunun ne olduğunu belirleyebilir misiniz?

int x = 5;
int result = ++x + x++ + --x;

Not: Bu kodla, bazen dile ve derleyiciye bağlı olarak farklı sonuçlar da alabilirsiniz.

Kendiniz ve kodunuzu okuyacak bir sonraki adam için hayatı kolaylaştırmak iyi bir fikirdir . Booleanların örtülü dönüşümü gibi yan etkilere güvenmek yerine, gerçekte ne olmasını istediğinizi açıkça yazın.


Meraktan result18 mi?
punkrockbuddyholly

5
@MrMisterMan: Javascript hakkında emin değilim, ancak Java ve C # 'da değerlendirmenin soldan sağa doğru olduğu garanti edilmektedir ve sonuç gerçekten 18'dir. C ve C ++ gibi bazı dillerde, bunun olacağının garantisi yoktur. soldan sağa olarak değerlendirilir ve derleyicinizin eklediği optimizasyonlara bağlı olarak farklı sonuçlar elde edebilirsiniz.
Zach Johnson

9

Sorunun ikinci kısmının cevabı, "bu tuhaflık hiç yararlı mı?" önceki yanıtın belirttiği gibi belki de hayır, eğer doğrunun dilin bir tuhaflığı (Javascript) doğruysa 1, ancak programcı genel olarak 1 ve true (ve 0 ve false) aynı şey.

Bununla birlikte, 1'in doğru ve 0'ın yanlış olduğu bir zihinsel modeliniz varsa, o zaman son derece yararlı, güçlü ve doğrudan olan her türlü güzel boolean tekniğine yol açar. Örneğin, bir sayacı doğrudan A> 100 sonucuyla arttırabilirsiniz; bu, A 100'den büyükse sayacı artırır. Bu teknik, Java'da bir tuhaflık veya hile olarak, ancak bir dizi veya işlevsel dilde görüntülenebilir. deyimsel olabilir.

Dizi dilindeki APL'deki klasik bir örnek, bir dizideki 100'den büyük (örneğin) öğelerin sayısını saymak olacaktır:

+/A>100

Burada A, 5 öğe dizisi 107 22 256 110 3 ise:

A>100

5 öğeli boole dizisini verir:

1 0 1 1 0

ve bu boole sonucunun toplanması:

+/1 0 1 1 0

son cevabı verir:

3

Bu soru , özellikle m'nin boole değerlerinin n'nin doğru olup olmadığını belirlemek için sorun genelleştirilirse, bu tekniğin çok yararlı olacağına mükemmel bir örnektir.

Üç booleandan en az ikisinin doğru olup olmadığını kontrol edin


7

Bu kolay.

(0 < 5 < 3)

İlk 0 <5'i değerlendirmek için soldan sağa doğru başlayın. Doğru mu? Evet. DOĞRU = 1 olduğundan, 1 <3 değerini değerlendirir. 1, 3'ten küçük olduğu için doğrudur.

Şimdi bununla

 (0 < 5 < 1)

0 5'ten az mı? Evet. Öyleyse DOĞRU olun. Bu da 1 anlamına gelir. Şimdi bu gerçeği göz önünde bulundurarak, (1 <1) olarak değerlendirir. 1 1'den küçük mü? Hayır, bu yüzden yanlış. Eşit olmalı.


4

1 <3 doğru olduğunda 1 döndürecek olan 0 <5 değerini değerlendiriyor mu?

C # bunu yapmanıza izin verir "Operatör '<', 'bool' ve 'int'" türündeki işlenenlere uygulanamaz


Bazen C # 'nin dinamik dillerdeki katılığını özlüyorum.
Arman McHitarian

4

Kısa bir süre önce Obj-C ile karşılaştım ve çok şaşırdım. Böyle bir şey yaparak istediğim sonuçları aldım:

if(0 < 5  && 5 < 3) {
alert("True");}

Tabii ki yanlış, bu yüzden "doğru" uyarıyı alamazsınız. Bunu okuduğuma sevindim, şimdi nedenini biliyorum.


4

Python'a ek olarak, CoffeeScript zincirleme karşılaştırmaları destekleyen başka bir dildir, bu nedenle vanilya JS'ye 3 < x < 10dönüştürülür(3 < x && x < 10)



1

Bir matematik operatörü üzerinden çalıştırıldığında bir boolean işlenen bir sayı döndürür. bunu kontrol etmek için yapıyoruz

true + 1  which gives you 2.

Böylece 0 < 5, matematik operatörü (<) ile çalıştırılan döndürülen boole (true) bir sayı döndürür. Böylece 1 <3 değerinde kaynar.true


1

0 değeri 5'ten küçük olduğu için bu true değerini döndürür ve varsayılan olarak true, 1 değerini de içerir ve yine 3'ten küçük olan ve yine true değerini döndüren 1 olarak değerlendirilebilir.


0

sonuçlarınızı Number () olarak ifade etmeyi deneyin

if(Number(0) < Number(5) < Number(3)) {
    alert("True");
}

veya şunu deneyin:

if(Number(0) < Number(5) && Number(5) < Number(3)) {
    alert("True");
}

Ben alınıyor çünkü bu googled (3 >= 20) //returning trueve ben dize formunda yazdırma işlevinden 3bu değeri alıyordum çünkü javascript bir boolean kontrol etmeye çalışıyordu sanırım .elm.getAttribute();console.log();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.