Почему новый Boolean (false) равен false в JavaScript? - программирование

Почему новый 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

Если да, то какой целью это служит?

4b9b3361

Ответ 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.