Ich habe in jsfiddle.net herumgespielt und bin gespannt, warum dies wahr ist.
if(0 < 5 < 3) {
alert("True");
}
So auch:
if(0 < 5 < 2) {
alert("True");
}
Das geht aber nicht:
if(0 < 5 < 1) {
alert("True");
}
Ist diese Eigenart jemals nützlich?
javascript
compare
operators
boolean-logic
Punkrockbuddyholly
quelle
quelle
Antworten:
Die Reihenfolge der Operationen bewirkt
(0 < 5 < 3)
, dass die Interpretation in Javascript so interpretiert wird, dass((0 < 5) < 3)
erzeugt(true < 3)
und wahr als 1 gezählt wird, wodurch wahr zurückgegeben wird.Dies ist auch der Grund
(0 < 5 < 1)
, warum false zurückgegeben wird und(0 < 5)
true zurückgegeben wird, was als interpretiert wird1
, was zu führt(1 < 1)
.quelle
if(0 < 5 < 1) == false
. Alles ist jetzt klar, danke :)((0 < 5) && (5 < 3))
, da es wahrscheinlich andere gibt, aber ich kenne sie nicht.Meine Vermutung ist, weil
0 < 5
es wahr ist undtrue < 3
gegossen wird,1 < 3
was wahr ist.quelle
wahrscheinlich , weil
true
als angenommen ,1
soquelle
Weil
true < 3
, weiltrue == 1
quelle
Zu Ihrer Frage, ob diese Eigenart jemals nützlich ist: Ich nehme an, es könnte einen Fall geben, in dem sie nützlich wäre (wenn Sie nach komprimiertem Code suchen), aber wenn Sie sich darauf verlassen, wird dies (höchstwahrscheinlich) die Verständlichkeit Ihres Codes erheblich beeinträchtigen.
Es ist so, als würde man Post / Pre-Inkrement / Dekrement als Teil größerer Ausdrücke verwenden. Können Sie auf einen Blick feststellen, was das Ergebnis dieses Codes ist?
Hinweis: Mit diesem Code können Sie je nach Sprache und Compiler manchmal sogar unterschiedliche Ergebnisse erzielen.
Es ist eine gute Idee, sich und dem nächsten Mann, der Ihren Code liest , das Leben zu erleichtern . Schreiben Sie klar auf, was tatsächlich passieren soll, anstatt sich auf Nebenwirkungen wie die implizite Konvertierung von Booleschen Werten zu verlassen.
quelle
result
18?Die Antwort auf den zweiten Teil der Frage: "Ist diese Eigenart jemals nützlich?" ist vielleicht nein, wie aus einer früheren Antwort hervorgeht, wenn es tatsächlich eine Eigenart der Sprache (Javascript) ist, dass true auf 1 gesetzt wird, der Programmierer jedoch im Allgemeinen nicht 1 und true (und 0 und false) als das betrachtet gleiche Sache.
Wenn Sie jedoch ein mentales Modell haben, bei dem 1 wahr und 0 falsch ist, führt dies zu allen möglichen netten booleschen Techniken, die äußerst nützlich, leistungsfähig und direkt sind. Sie können beispielsweise einen Zähler direkt mit dem Ergebnis von A> 100 erhöhen, wodurch der Zähler erhöht wird, wenn A größer als 100 ist. Diese Technik kann in Java als Eigenart oder Trick angesehen werden, jedoch in einem Array oder einer funktionalen Sprache kann idiomatisch sein.
Ein klassisches Beispiel in der Array-Sprache APL wäre das Zählen der Anzahl von Elementen in einem Array, die (sagen wir) größer als 100 sind:
Wenn A das Array mit 5 Elementen ist 107 22 256 110 3, dann:
ergibt das boolesche Array mit 5 Elementen:
1 0 1 1 0
und Summieren dieses booleschen Ergebnisses:
ergibt die endgültige Antwort:
3
Diese Frage ist ein perfektes Beispiel dafür, wo diese Technik sehr nützlich wäre, insbesondere wenn das Problem verallgemeinert wird, um festzustellen, ob n von m booleschen Werten wahr sind.
Überprüfen Sie, ob mindestens zwei von drei Booleschen Werten wahr sind
quelle
Das ist einfach.
Beginnen Sie mit von links nach rechts, damit die erste 0 <5 ausgewertet wird. Ist das wahr? Ja. Da TRUE = 1 ist, wird 1 <3 ausgewertet. Da 1 kleiner als 3 ist, ist es wahr.
Nun dazu
Ist 0 kleiner als 5? Ja. Machen Sie es also WAHR, was auch 1 bedeutet. In Anbetracht dieser Tatsache ergibt es (1 <1). Ist 1 kleiner als 1? Nein, deshalb ist es falsch. Es muss gleich sein.
quelle
Wird 0 <5 ausgewertet, was 1 für wahr zurückgeben würde, wenn 1 <3 wahr ist?
Mit C # möchten Sie dies tun. "Operator '<' kann nicht auf Operanden vom Typ 'bool' und 'int' angewendet werden."
quelle
Ich bin vor einiger Zeit in Obj-C darauf gestoßen und war sehr verwirrt darüber. Ich habe die gewünschten Ergebnisse erzielt, indem ich so etwas gemacht habe:
Was natürlich falsch ist, damit Sie diesen "wahren" Alarm nicht erhalten. Ich bin froh, dass ich das gelesen habe, jetzt weiß ich warum.
quelle
Neben Python ist CoffeeScript eine weitere Sprache, die verkettete Vergleiche unterstützt und daher in Vanilla JS
3 < x < 10
konvertiert wird(3 < x && x < 10)
quelle
quelle
Ein boolescher Operand gibt eine Zahl zurück, wenn er über einen mathematischen Operator operiert wird. um dies zu überprüfen, tun wir es
Also
0 < 5
, die zurück boolean (true) betrieben mit Mathe - Operator (<) wird eine Reihe zurück. Es kocht also auf 1 <3, was zurückkehrttrue
quelle
Da 0 kleiner als 5 ist, gibt dies true zurück, und standardmäßig ist true alles, einschließlich und kann zu 1 ausgewertet werden, was immer noch kleiner als 3 ist, was wiederum true zurückgibt
quelle
Versuchen Sie, Ihre Ergebnisse als Zahl () zu formulieren.
oder versuchen Sie dies:
Ich habe dies gegoogelt, weil ich es bekommen habe
(3 >= 20) //returning true
und ich denke, Javascript hat versucht, es3
als Booleschen Wert zu überprüfen, weil ich diesen Wert von derelm.getAttribute();
Funktion erhalten habe, dieconsole.log();
in String-Form gedruckt wurde.quelle