C'est selon les spécifications.
12.5 L'instruction if
.....
2. Si ToBoolean (GetValue (exprRef)) est vrai, alors
une. Renvoie le résultat de l'évaluation de la première instruction.
3. Sinon,
....
ToBoolean, selon la spécification, est
L'opération abstraite ToBoolean convertit son argument en une valeur de type Boolean selon le tableau 11:
Et ce tableau dit ceci à propos des chaînes:
Le résultat est faux si l'argument est la chaîne vide (sa longueur est nulle); sinon le résultat est vrai
Maintenant, pour expliquer pourquoi "0" == false
vous devriez lire l'opérateur d'égalité, qui indique qu'il obtient sa valeur de l'opération abstraite GetValue(lref)
correspond de même pour le côté droit.
Qui décrit cette partie pertinente comme:
si IsPropertyReference (V), alors
une. Si HasPrimitiveBase (V) est faux, alors get sera la méthode interne [[Get]] de base, sinon laissez get
être la méthode interne [[Get]] spéciale définie ci-dessous.
b. Renvoie le résultat de l'appel de la méthode interne get en utilisant la base comme sa valeur this et en passant
GetReferencedName (V) pour l'argument
Ou en d'autres termes, une chaîne a une base primitive, qui rappelle la méthode interne get et finit par sembler fausse.
Si vous souhaitez évaluer des choses à l'aide de l'opération GetValue ==
, si vous souhaitez évaluer à l'aide de ToBoolean
, utilisez ===
(également appelé opérateur d'égalité "strict")
"0"
est une chaîne, et comme elle n'est pas vide, elle est évaluée à true.