Причина, по которой последняя строка false
заключается в том, что ==
не является простым булевым преобразованием. Он обычно пытается преобразовать операнды с несогласованными типами вплоть до числа.
Так что 5
не нуждается в конверсии, так как это уже номер, но !0
, что составляет true
. Значение true
преобразуется в 1
, поэтому не совпадает 5
.
Вы можете сделать вывод, что 1 == !0
будет true
, и это действительно так.
Это подробно описано в спецификации ES5 в Abstract Equality Comparison Algorithm, стадии 7, в котором говорится о сравнении x == y
:
Если Тип (у) булева, вернуть результат сравнения х == ToNumber (y).
Таким образом, правое булевское число принудительно приводится к числу с ToNumber. В этом случае, ToNumber говорит:
В результате если аргумент верно.
* 5 будет преобразовано в false *? – DontVoteMeDown
Как связанный с вами вопрос связан с вашим вопросом? – j08691
Потому что (5 ==! 0) эквивалентно (5 == true), что неверно. –