В книге JavaScript Flanagan O'Reilly указано:
В отличие от && и || операторов,! оператор преобразует свой операнд в булево значение [...] перед инвертированием преобразованного значения.
Если эти логические операторы не преобразуют операнды в booleans, как можно оценить выражение?