111 votes

Pourquoi fait (' 0 ' ? ' un ' : ' b ') se comportent différent (' 0 ' == true ? ' un ' : ' b ')

Pourquoi est le résultat des deux instructions suivantes différentes ?

jsFiddle testcase

Edit :

Je dois ajouter que je soupçonne la première instruction '0' à être castées en boolean à comparer - qui devrait être exactement le même comme ""0"== true" évidemment ce n’est pas vrai.

207voto

Felix Kling Points 247451

D'abord, par souci d'exhaustivité:

('0' ? 'a' : 'b') 

est - 'a'car '0' est un non-vide de la chaîne, qui prend toujours la valeur true:

Chaîne: Le résultat est faux si l'argument est une Chaîne de caractères vide (sa longueur est égale à zéro); sinon, le résultat est vrai.


Maintenant, pour '0' == true.

Deux conversions de type aura lieu ici. Nous pouvons suivre ce dans le cahier des charges, section 11.9.3, L'Abrégé de l'Égalité de l'Algorithme de Comparaison.

Les opérandes sont notées x et y (x == y).

Dans notre cas, x est une chaîne de caractères ('0') et y est une valeur Booléenne (true). Donc l'étape 7 est exécutée:

Si le Type(y) est un Booléen, retourner le résultat de la comparaison x == ToNumber(y).

Lorsque les booléens sont converties en nombres, la conversion suivante a lieu:

Booléen: Le résultat est 1 si l'argument est vrai. Le résultat est +0 si l'argument est faux.

Maintenant, nous avons

'0' == 1

qui correspond à la condition de l'étape 5:

Si le Type(x) est une Chaîne et le Type(y) est le Nombre, de retourner le résultat de la comparaison ToNumber(x) == y.

Comment les chaînes sont converties en nombres est plus complexe mais bien sûr, peut également être trouvée dans la spécification.

Donc la comparaison finale est

0 == 1

qui est - false (de l'étape 1. un. vi.)

8voto

Bakudan Points 5469
('0' ? 'a' : 'b'); /* -> 'a' */

0 est une valeur de chaîne, chaque chaîne non vide est évaluée comme vraie, et n'est pas testé en tant que booléen. Si les devis sont supprimés:

(0 ? 'a' : 'b'); /* -> 'b' */

vous recevrez b - maintenant 0 n'est pas une chaîne et évaluée comme fausse!

('0' == true ? 'a' : 'b'); /* -> 'b' */

0 est évaluée comme bool les Deux sont évalués comme nombres, ce qui est faux. Point 11.9.3 Le Résumé de l'Égalité de l'Algorithme de Comparaison à partir des spécifications de montrer qu'un certain nombre de conversions peuvent être exécutées de manière à comparer le même type de variables.

3voto

Alex Farber Points 19387

Parce que '0' n’est pas égal 1, donc il n'est pas égale à true, si elle n’est pas faux. Dans le premier cas, lorsque le '0' est coulé en bool, opérateur de cast retourne true pour tout ce qui n’est pas 0.

1voto

Michael Aaron Safyan Points 45071

Surtout parce que JavaScript est sacrément incompatible lorsqu’il s’agit de la vérité-iness. Mais la réponse est :

  1. Dans ce cas, '0' est converti directement en une valeur booléenne et '0', étant une chaîne non vide, est vrai.
  2. Dans ce cas, aucune conversion n’a lieu ; une chaîne n’est pas égale à une valeur booléenne.

-3voto

ammoQ Points 17866

C’est parce que est trueish (dans un if déclaration), mais pas considéré comme égal à . Tout comme les 3 et 17 sont trueish, mais pas identiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X