Почему! New Boolean (false) равно false в JavaScript? - PullRequest
29 голосов
/ 02 января 2012

С в документацию jQuery о типах JavaScript входит фрагмент кода, описывающий поведение строк при преобразовании в логическое значение (эта тема не связана с этим вопросом, но именно там я нашел код):

!"" // 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

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

Ответы [ 2 ]

27 голосов
/ 02 января 2012

new Boolean(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"
8 голосов
/ 02 января 2012

Поскольку new Boolean возвращает объект , как указано здесь .

! определяется следующим образом :

11.4.9 Оператор логического НЕ (!)

Производство UnaryExpression : ! UnaryExpression оценивается следующим образом:

  1. Пусть expr будет результатом вычисления UnaryExpression .

  2. Пусть oldValue будет ToBoolean(GetValue(expr)).

  3. Если oldValue равно true, вернуть false.

  4. Возврат true.

и

9,2 ToBoolean

Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:

Таблица 11 - Преобразования ToBoolean

Тип аргумента - Результат

...

Объект - true

Итак, это объект, поэтому ToBoolean возвращает true, следовательно, ! возвращает false.

...