Ce comportement peut être surprenant, mais peut être expliqué par le fait d'avoir un coup d'oeil à la spécification.
On a qu'à regarder ce qui se passe quand une comparaison avec l' égale de l'opérateur est effectuée. L'algorithme exact est défini dans la section 11.9.3.
string == integer
L'étape que nous avons à regarder, c'est #5:
5. Si Type(x)
est une Chaîne et d' Type(y)
est Nombre,
retourner le résultat de la comparaison, ToNumber(x) == y
.
Cela signifie que la chaîne de caractères "\n"
("\r"
, "\t"
) est converti en un nombre premier et ensuite comparés 0
.
Comment est une chaîne de caractères convertie en un nombre? Ceci est expliqué dans la section 9.3.1. En bref, nous avons:
Le MV (valeur mathématique) de l' StringNumericLiteral ::: StrWhiteSpace
est 0
.
où StrWhiteSpace
est défini comme
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpace_opt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
Cela signifie que la valeur numérique de chaînes de caractères contenant des caractères espace et/ou un terminateur de ligne est - 0
.
Les caractères qui sont considérés comme des caractères espace est défini dans la section 7.3.
string == boolean
L'étape que nous avons à regarder, c'est #7:
7. Si le Type(y) est un Booléen, retourner le résultat de la comparaison, x == ToNumber(y)
.
Comment les booléens sont converties en nombres est assez simple: true
devient 1
et false
devient 0
.
Après, nous sommes la comparaison d'une chaîne à l'encontre d'un certain nombre, ce qui est expliqué ci-dessus.
Comme d'autres l'ont mentionné, une comparaison stricte (===
) peut être utilisé pour éviter ce "problème". En fait, vous ne devriez utiliser la comparaison si vous savez ce que vous faites et que vous voulez ce comportement.