Выражение [] == ![] вычисляется как true.
console.log([] == ![]); // true
JavaScript применяет loose equality (==), которое запускает серию преобразований типов:
![] вычисляется в первую очередь — так как массивы truthy, отрицание даёт false[] == falsefalse преобразуется в число: false → 0[] преобразуется в примитив: [] → "" → 00 == 0 равно true! преобразует операнд в boolean перед отрицаниемToNumber().toString(), давая """" преобразуется в 0 через ToNumber()Это классический пример того, почему loose equality (==) может давать неожиданные результаты. Выражение выглядит так, будто должно вернуть false, но приведение типов делает его true. Strict equality (===) полностью избегает этой проблемы:
console.log([] === ![]); // false — преобразование типов не применяется
При вычислении [] == ![] оператор ! применяется после того, как оператор нестрогого равенства определяет, что обе стороны нуждаются в приведении типов.
Новый — ещё не проверен сообществом
Вы