2016-04-23 2 views
2

Brushing sur == et ===, je ne peux pas vraiment me convaincre avec une explication à ce sujet.Pourquoi 1.2 == true renvoie false si Boolean (1.2) est vrai?

Je prends un nombre à virgule flottante et fais un == avec un Booleantrue. Il renvoie false. Mais quand je convertis explicitement le nombre à virgule flottante en un booléen, il retourne vrai. Le == ne devrait-il pas d'abord convertir le 1.2 en un booléen et le comparer au vrai de l'autre côté?

> Boolean(1.2) 
true 
> 1.2 == true 
false 

D'autre part, un "entier" se comportera comme je l'attend.

> 1 == true 
true 

Répondre

4

Comme vous l'avez dit plus haut 1.2 ne seront pas converties en booléen premier.

Selon le le abstract equality comparison algorithm, les étapes suivantes sont exécutées en

  • 1.2 == true
  • 1.2 == toNumber(true) (Dans l'algorithme, l'étape no 7)
  • 1.2 == 1 (Dans l'algorithme, l'étape n ° 1)
  • false
+0

Merci. Ne devrait-on pas convertir le nombre à gauche en Booléen et non le Booléen à droite en nombre? Je n'ai pas encore consacré du temps à lire la norme ECMA, donc désolé de demander. –

+0

@DrunkenMaster Non, lorsque vous utilisez l'opérateur '==' pour comparer des valeurs, Basé sur AECAlgorithm les deux de son type seront forcés au type 'number'. J'avais donné les numéros de pas de l'algorithme original, jetez un oeil à ceux-ci. Cela vous donnera une prise en main ferme sur ce concept. –

+1

OK, je regardais un cours vidéo, où le narrateur commente cela et il explique que le nombre est converti, pas le booléen. Merci pour la référence. –