Por que o! New Boolean (false) é igual a false em JavaScript?

A partir da documentação do jQuery sobre os tipos de JavaScript, vem este trecho de código que descreve o comportamento das strings quando convertido em booleano (esse tópico não está relacionado a essa pergunta, mas é exatamente onde eu encontrei o código):

!"" // true !"hello" // false !"true" // false !new Boolean(false) // false 

Eu obtenho os primeiros três exemplos, mas não recebo o último exemplo, porque:

 new Boolean(false) == false //true !false // true 

Então eu diria:

 !new Boolean(false) // true 

Mas ao invés:

 !new Boolean(false) // false, mind = blown 

O que é isso eu nem mesmo …

É porque:

 new Boolean(false) === false // false 

Se sim, para que serve isso?

new Boolean(false) retorna um object que não é nulo. Objetos não nulos são sempre verdadeiros.

Como resultado ! de qualquer object não nulo será sempre falso.


Para provar isso a si mesmo, você pode executar isso no seu console javascript

 (typeof new Boolean(false)) //"object" 

Além disso, você pode usar o operador de strict equality para confirmar que o new Boolean(false) não é realmente false :

 new Boolean(false) === false // false 

Aliás, chamar a function Boolean como uma function – sem a nova – na verdade, retorna um primitivo

 !Boolean(false) // true (typeof Boolean(false)) //"boolean" 

Porque o new Boolean retorna um object como indicado aqui .

O ! é definido da seguinte forma :

11.4.9 Operador NOT Lógico ( ! )

A produção UnaryExpression:! O UnaryExpression é avaliado da seguinte forma:

  1. Deixe expr ser o resultado da avaliação de UnaryExpression .

  2. Deixe oldValue ser ToBoolean(GetValue(expr)) .

  3. Se oldValue for true , retorne false .

  4. Retornar true

e :

9.2 ToBoolean

A operação abstrata ToBoolean converte seu argumento para um valor do tipo booleano de acordo com a Tabela 11:

Tabela 11 – Conversões ToBoolean

Tipo de Argumento – Resultado

Objeto – true

Então, é um object, assim ToBoolean retorna true , daí ! retorna false .