Почему новый Boolean (false) равен false в JavaScript?
Из в документации jQuery по типам JavaScript приходит этот фрагмент кода, описывающий поведение строк при преобразовании в booleans (эта тема не связана с этот вопрос, но именно там, где я нашел код):
!"" // true
!"hello" // false
!"true" // false
!new Boolean(false) // false
Я получаю первые три примера, но я не получаю последний пример, потому что:
new Boolean(false) == false //true
!false // true
Итак, я бы предположил:
!new Boolean(false) // true
Вместо этого:
!new Boolean(false) // false, mind = blown
Что это я даже не...
Это потому, что:
new Boolean(false) === false // false
Если да, то какой целью это служит?
Ответы
Ответ 1
new Boolean(false)
возвращает объект, который не является нулевым. Непустые объекты всегда правдивы.
В результате !
любого непустого объекта всегда будет false.
Чтобы убедиться в этом, вы можете запустить это в своей консоли javascript
(typeof new Boolean(false)) //"object"
Кроме того, вы можете использовать оператор strict equality
для подтверждения того, что new Boolean(false)
не действительно false
:
new Boolean(false) === false // false
Кстати, вызов функции Boolean
как функции - без нового - на самом деле возвращает примитив
!Boolean(false) // true
(typeof Boolean(false)) //"boolean"
Ответ 2
Потому что new Boolean
возвращает объект как указано здесь.
!
определяется следующим образом:
11.4.9 Логический оператор NOT (!
)
Производственное UnaryExpression: !
UnaryExpression оценивается следующим образом:
-
Пусть expr является результатом вычисления UnaryExpression.
-
Пусть oldValue будет ToBoolean(GetValue(expr))
.
-
Если oldValue true
, верните false
.
-
Возврат true
.
и:
9.2 ToBoolean
Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:
Таблица 11 - Конверсии ToBoolean
Тип аргумента - результат
...
Объект - true
Итак, это объект, поэтому ToBoolean
возвращает true
, поэтому !
возвращает false
.