Pourquoi n' (0

je jouais dans jsfiddle.net et je suis curieux de savoir pourquoi cela revient-il vrai?

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

Donc cela:

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

Mais ce n'est pas:

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

est-ce que cette bizarrerie est utile?

337
demandé sur Michał Perłakowski 2010-11-03 19:32:54
la source

13 ответов

Ordre des opérations causes (0 < 5 < 3) être interprété en javascript comme ((0 < 5) < 3) qui produit (true < 3) et le vrai est compté comme 1, à l'origine pour retourner la valeur true.

C'est aussi pourquoi (0 < 5 < 1) retourne false, (0 < 5) retourne true, ce qui est interprété comme 1 , résultant en (1 < 1) .

429
répondu Alan Geleynse 2010-11-03 19:42:54
la source

ma supposition est parce que 0 < 5 est vrai, et true < 3 obtient moulé à 1 < 3 qui est vrai.

62
répondu CaffGeek 2010-11-03 19:34:48
la source

probablement parce que true est supposé comme 1 donc

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
21
répondu Jack 2010-11-03 19:36:05
la source

parce que true < 3 , parce que true == 1

17
répondu Harmen 2010-11-03 19:35:13
la source

quant à votre question si ce quirk est jamais utile: je suppose qu'il pourrait y avoir un certain cas où il serait utile (si le code condensé est ce que vous êtes après), mais en se basant sur elle va (très probablement) gravement réduire la compréhensibilité de votre code.

c'est un peu comme Utiliser post/pre increment/decrement comme une partie d'expressions plus grandes. Pouvez-vous déterminer d'un seul coup d'œil le résultat de ce code?

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

Note: ce code, vous pouvez même parfois obtenir des résultats différents selon la langue et le compilateur.

c'est une bonne idée de rendre la vie facile pour vous et le prochain gars qui lira votre code. Écrivez clairement ce que vous voulez réellement avoir se produire plutôt que de compter sur les effets secondaires comme la conversion implicite de booléens.

10
répondu Zach Johnson 2010-11-03 23:57:39
la source

la réponse à La deuxième partie de la question, "est ce caprice jamais utile?"est peut-être non, comme noté par une réponse précédente, si c'est bien une bizarrerie du langage (Javascript) que vrai est jeté à 1, mais que le programmeur ne fait pas dans la vue générale 1 et vrai (et 0 et faux) comme la même chose.

si toutefois vous avez un modèle mental de 1 étant vrai et 0 étant faux, alors il conduit à toutes sortes de belles techniques booléennes qui sont extrêmement utiles, puissant et direct. 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) plus de 100:

+/A>100

où Si A est le 5 élément de tableau 107 22 256 110 3 puis:

A>100

donne l'5 élément booléen tableau:

1 0 1 1 0

et résumant ce résultat booléen:

+/1 0 1 1 0

donne la réponse finale:

3

cette question est un exemple parfait de l'utilité de cette technique, surtout si le problème est généralisé pour déterminer si n hors des valeurs m booléennes sont vraies.

vérifiez si au moins deux booléens sur trois sont vrais

9
répondu PAUL Mansour 2017-05-23 15:18:03
la source

c'est facile.

(0 < 5 < 3)

commence par de gauche à droite pour évaluer le premier 0 < 5. Est-il vrai? Oui. Comme TRUE=1, il évalue 1 < 3. Puisque 1 est moins de 3 donc c'est vrai.

maintenant avec ce

 (0 < 5 < 1)

est 0 moins de 5? Oui. Donc, faites-le vrai ce qui signifie aussi 1. Maintenant, avec ce fait à l'esprit, il évalue à (1 < 1). Est-ce que 1 est moins de 1? Non, donc c'est faux. Il doit être égal.

7
répondu netrox 2010-11-04 08:06:43
la source

évalue-t-il 0<5 qui retournerait 1 pour vrai quand 1<3 ce qui est vrai?

C# voulez vous laisser faire cela "Opérateur" < " ne peut pas être appliquée à des opérandes de type 'bool' et de 'int'"

4
répondu David 2010-11-03 19:39:17
la source

je suis tombé là-dessus il y a peu de temps à Obj-C et j'étais très perplexe. J'ai obtenu les résultats que je voulais en faisant quelque chose comme ceci:

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

ce qui est évidemment faux pour que vous n'ayez pas cette "vraie" alerte. Content d'avoir lu ça, je sais maintenant pourquoi.

4
répondu Hippocrates 2010-11-04 00:28:24
la source

en plus de python, CoffeeScript est un autre langage qui supporte les comparaisons enchaînées, donc 3 < x < 10 serait converti en (3 < x && x < 10) dans vanilla JS

3
répondu Hippocrates 2012-10-29 20:01:23
la source
0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
3
répondu truease.com 2016-01-10 01:24:47
la source

un opérande booléen lorsqu'il est utilisé sur un opérateur mathématique renvoie un nombre. pour vérifier cela, nous faisons

true + 1  which gives you 2.

So 0 < 5 , le booléen retourné(vrai) opéré avec l'opérateur mathématique(<) retournera un nombre. Donc il revient à 1<3 qui renvoie true

1
répondu Rajkamal Subramanian 2011-12-06 17:50:21
la source

parce que 0 est moins de 5 alors que renvoie true, et par défaut true est n'importe quoi y compris et peut être évalué à 1 qui est encore moins de 3 qui renvoie encore true

0
répondu ndoty 2018-07-30 18:12:44
la source

Autres questions sur javascript boolean-logic operators compare