为什么!新的布尔值(false)在JavaScript中等于false?

时间:2012-01-01 20:32:01

标签: javascript language-design

来自the jQuery documentation的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 个答案:

答案 0 :(得分:26)

new Boolean(false)会返回对象,该对象不为空。非null对象总是真实的。

因此,任何非null对象的!将始终为false。


要向自己证明,您可以在javascript控制台中运行

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

此外,您可以使用strict equality运算符确认new Boolean(false)不是false

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

顺便说一下,将Boolean函数作为函数调用 - 没有new - 实际上会返回一个原语

!Boolean(false) // true

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

答案 1 :(得分:8)

因为new Boolean会返回一个对象as stated here

!定义为as follows

  

11.4.9逻辑NOT运算符(!

     

生产 UnaryExpression ! UnaryExpression 评估如下:

     
      
  1. expr 成为评估 UnaryExpression 的结果。

  2.   
  3. oldValue 成为ToBoolean(GetValue(expr))

  4.   
  5. 如果 oldValue true,请返回false

  6.   
  7. 返回true

  8.   

and

  

9.2 ToBoolean

     

抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:

     

表11 - ToBoolean Conversions

     

参数类型 - 结果

     

...

     

对象 - true

因此,它是一个对象,因此ToBoolean会返回true,因此!会返回false