Parce que vous comparez l' (boolean) résultat de la première égalité avec la (non-booléenne) troisième valeur.
Dans le code, 1 == 1 == 1
est équivalent à (1 == 1) == 1
est équivalent à true == 1
.
Cela signifie que les trois méthodes peuvent être écrit plus simplement:
function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }
Ces comparaisons travail en fonction de ces règles (l'emphase est mienne):
Si les deux opérandes ne sont pas du même type, JavaScript convertit le
opérandes, puis applique une stricte comparaison. Si l'un des deux opérandes est un
nombre ou une valeur de type boolean, les opérandes sont convertis en nombres si
possible; d'autre si l'un des deux opérandes est une chaîne, la chaîne d'opérande est
convertie en un nombre si possible. Si les deux opérandes sont des objets, puis
JavaScript compare les références internes qui sont égales lorsque les opérandes
se référer au même objet en mémoire.
Donc ce qui se passe dans c
que "a"
, est converti en un nombre (en donnant des NaN
) et le résultat est strictement par rapport à l' true
converti en nombre (en donnant des 1
).
Depuis 1 === NaN
est false
, la troisième fonction renvoie false
. Il est très facile de voir pourquoi les deux premières fonctions retournent true
.