为什么在JavaScript中!new Boolean(false)等于false?

32

以下代码片段来自jQuery文档,描述了将字符串转换为布尔值时的行为(该主题与此问题无关,但这是我找到代码的地方):

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

如果是这样,那么这有什么作用呢?


4
深入分析的问题,点赞。 - Praveen
2个回答

30

new Boolean(false)返回一个对象。所有对象(除了浏览器中的document.all)都是真值

因此,任何对象的!始终为false


您可以在JavaScript控制台中运行以下代码以自行验证:

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

此外,您可以使用严格相等运算符===来确认new Boolean(false)实际上并不是false

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

顺便提一下,将Boolean函数直接作为函数调用,而不使用new关键字,实际上会返回一个原始值:

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

8

因为new Boolean返回一个对象如此声明

!定义如下:

11.4.9逻辑非运算符(

产生式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


当前规范:Boolean普通对象ToBoolean。如果要编辑此答案,则可能需要解释OrdinaryCreateFromConstructor创建普通对象,并且NewTarget是一个产生式,在Boolean()的情况下,它的值为undefined,但在new Boolean()的情况下不是。 - Sebastian Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接