Tldr ; ceci est dû à la [ToNumber] les conversions dans le ==
algorithme de l'opérateur.
La première étape consiste à simplifier l'expression. Puisque !!x=="x"
est analysé comme (!!x)=="x"
y !!a_truthy_expression -> true
l'expression pertinente réelle de l'égalité est
!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String
Donc, en regardant les règles pour 11.9.3 L'algorithme de comparaison d'égalité abstraite et en suivant les rendements de l'application
Règle 6 - Si Type(x) est booléen, retourner le résultat de la comparaison ToNumber(x) == y.
ce qui entraîne Number==String
ou 1=="1" et 1=="2", respectivement. 1 . Alors la règle
Règle 7 - Si Type(x) est un nombre et Type(y) est une chaîne, retourne le résultat de la comparaison x == ToNumber(y).
est appliquée, ce qui donne lieu à Number==Number
ou 1==1 et 1==2, respectivement 1 ; ce dernier point est clairement faux.
Règle 1 - Si Type(x) est le même que Type(y), alors [par c.iii.] Si x est la même valeur numérique que y, retourner true [else return false].
(Le même algorithme explique le String==Boolean
cas lorsque les règles de complémentarité sont appliquées).
1 Pour voir l'application de la règle [ToNumber], considérez :
+false -> 0
+true -> 1
+"1" -> 1
+"2" -> 2