Je jouais sur jsfiddle.net et je suis curieux de savoir pourquoi cela revient vrai?
if(0 < 5 < 3) {
alert("True");
}
Il en va de même:
if(0 < 5 < 2) {
alert("True");
}
Mais cela ne veut pas:
if(0 < 5 < 1) {
alert("True");
}
Cette bizarrerie est-elle jamais utile?
javascript
compare
operators
boolean-logic
punkrockbuddyholly
la source
la source
Réponses:
L'ordre des opérations entraîne
(0 < 5 < 3)
l'interprétation en javascript de((0 < 5) < 3)
ce qui produit(true < 3)
et true est compté comme 1, ce qui renvoie true.C'est aussi pourquoi
(0 < 5 < 1)
renvoie false,(0 < 5)
retourne true, ce qui est interprété comme1
résultant en(1 < 1)
.la source
if(0 < 5 < 1) == false
. Tout est clair maintenant, merci :)((0 < 5) && (5 < 3))
, il y en a probablement d'autres mais je ne les connais pas.Je suppose que c'est parce que
0 < 5
c'est vrai, ettrue < 3
est jeté sur1 < 3
ce qui est vrai.la source
probablement parce
true
est prise comme1
sila source
Parce que
true < 3
quetrue == 1
la source
Quant à votre question de savoir si cette bizarrerie est jamais utile: je suppose qu'il pourrait y avoir un cas où elle serait utile (si le code condensé est ce que vous recherchez), mais le fait de vous y fier réduira (très probablement) considérablement la compréhensibilité de votre code.
C'est un peu comme utiliser post / pre increment / decrement dans le cadre d'expressions plus grandes. Pouvez-vous déterminer le résultat de ce code en un coup d'œil?
Remarque: avec ce code, vous pouvez parfois même obtenir des résultats différents selon la langue et le compilateur.
C'est une bonne idée de vous faciliter la vie et celle du prochain gars qui lira votre code. Écrivez clairement ce que vous voulez réellement faire, plutôt que de vous fier à des effets secondaires comme la conversion implicite des booléens.
la source
result
18 ans?La réponse à la deuxième partie de la question, "cette bizarrerie est-elle jamais utile?" est peut-être non, comme indiqué dans une réponse précédente, si c'est bien une bizarrerie du langage (Javascript) que true est converti en 1, mais que le programmeur ne voit pas en général 1 et true (et 0 et false) comme même chose.
Si toutefois vous avez un modèle mental où 1 est vrai et 0 est faux, cela conduit à toutes sortes de belles techniques booléennes qui sont extrêmement utiles, puissantes et directes. Par exemple, vous pouvez incrémenter un compteur directement avec le résultat de A> 100, ce qui incrémenterait le compteur si A est supérieur à 100. Cette technique peut être considérée comme une bizarrerie ou une astuce en Java, mais dans un tableau ou un langage fonctionnel. peut être idiomatique.
Un exemple classique dans le langage de tableau APL serait de compter le nombre d'éléments dans un tableau qui sont (disons) supérieurs à 100:
Où si A est le tableau de 5 éléments 107 22256110 3 alors:
donne le tableau booléen à 5 éléments:
1 0 1 1 0
et en sommant ce résultat booléen:
donne la réponse finale:
3
Cette question est un exemple parfait où cette technique serait très utile, surtout si le problème est généralisé pour déterminer si n sur m valeurs booléennes sont vraies.
Vérifiez si au moins deux booléens sur trois sont vrais
la source
C'est facile.
Commencez de gauche à droite pour évaluer le premier 0 <5. Est-ce vrai? Oui. Puisque TRUE = 1, il évalue 1 <3. Puisque 1 est inférieur à 3, c'est vrai.
Maintenant avec ça
0 est-il inférieur à 5? Oui. Donc, faites-le VRAI, ce qui signifie également 1. Maintenant, avec ce fait à l'esprit, il est évalué à (1 <1). Est-ce que 1 est inférieur à 1? Non, donc c'est faux. Cela doit être égal.
la source
évalue-t-il 0 <5 qui retournerait 1 pour vrai quand 1 <3 qui est vrai?
C # veut vous laisser faire ceci "L'opérateur '<' ne peut pas être appliqué aux opérandes de type 'bool' et 'int'"
la source
Je l'ai rencontré il y a quelque temps à Obj-C et j'ai été très perplexe. J'ai obtenu les résultats que je voulais en faisant quelque chose comme ceci:
Ce qui est bien sûr faux afin que vous n'obteniez pas cette "vraie" alerte. Heureux d'avoir lu ceci, je sais maintenant pourquoi.
la source
En plus de python, CoffeeScript est un autre langage qui prend en charge les comparaisons chaînées, donc
3 < x < 10
serait converti(3 < x && x < 10)
en vanilla JSla source
la source
Un opérande booléen lorsqu'il est opéré sur un opérateur mathématique renvoie un nombre. pour vérifier cela, nous le faisons
Ainsi
0 < 5
, le booléen retourné (vrai) opéré avec l'opérateur mathématique (<) renverra un nombre. Il revient donc à 1 <3 qui renvoietrue
la source
parce que 0 est inférieur à 5 alors cela renvoie vrai, et par défaut vrai est tout ce qui inclut et peut être évalué à 1 qui est toujours inférieur à 3 qui retourne à nouveau vrai
la source
essayez de formuler vos résultats sous forme de nombre ()
ou essayez ceci:
J'ai googlé ceci parce que j'obtenais
(3 >= 20) //returning true
et je suppose que javascript essayait de vérifier en3
tant que booléen parce que j'obtenais cette valeur de laelm.getAttribute();
fonction quiconsole.log();
imprimait sous forme de chaîne.la source