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

Mic*_*out 29 javascript language-design

从JavaScript类型的jQuery文档中可以看到这段代码描述转换为布尔值时字符串的行为(该主题与此问题无关,但它只是我找到代码的地方):

!"" // true
!"hello" // false
!"true" // false
!new Boolean(false) // false
Run Code Online (Sandbox Code Playgroud)

我得到前三个例子,但我没有得到最后一个例子,因为:

new Boolean(false) == false //true
!false // true
Run Code Online (Sandbox Code Playgroud)

所以我假设:

!new Boolean(false) // true
Run Code Online (Sandbox Code Playgroud)

但反而:

!new Boolean(false) // false, mind = blown
Run Code Online (Sandbox Code Playgroud)

这是什么我甚至不...

是因为:

new Boolean(false) === false // false
Run Code Online (Sandbox Code Playgroud)

如果是这样,它的用途是什么?

Ada*_*kis 27

new Boolean(false)返回一个非null 的对象.非null对象总是真实的.

因此,!任何非null对象都将始终为false.


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

(typeof new Boolean(false))  //"object"
Run Code Online (Sandbox Code Playgroud)

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

new Boolean(false) === false  // false
Run Code Online (Sandbox Code Playgroud)

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

!Boolean(false) // true

(typeof Boolean(false))  //"boolean"
Run Code Online (Sandbox Code Playgroud)


pim*_*vdb 8

因为new Boolean返回此处所述的对象.

的!定义如下:

11.4.9逻辑NOT运算符(!)

生产UnaryExpression:! UnaryExpression的计算方法如下:

  1. 设expr是评估UnaryExpression的结果.

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

  3. 如果是oldValuetrue,则返回false.

  4. 返回true.

并且:

9.2 ToBoolean

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

表11 - ToBoolean转换

参数类型 - 结果

...

对象 - true

所以,它是一个对象,因此ToBoolean返回true,因此!返回false.