【问题标题】:Why does !new Boolean(false) equals false in JavaScript?为什么 !new Boolean(false) 在 JavaScript 中等于 false?
【发布时间】:2012-01-01 20:32:01
【问题描述】:

来自 JavaScript 类型的 the jQuery documentation 的这段代码描述了字符串在转换为布尔值时的行为(该主题与此问题无关,但它正是我找到代码的地方):

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

如果是这样,这样做的目的是什么?

【问题讨论】:

  • +1 表示深入分析的问题。

标签: javascript language-design


【解决方案1】:

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

因此,任何对象的! 将始终为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"

【讨论】:

    【解决方案2】:

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

    ! 定义为as follows

    11.4.9 逻辑非运算符(!

    产生式 UnaryExpression : ! UnaryExpression 评估如下:

    1. expr 为计算 UnaryExpression 的结果。

    2. oldValueToBoolean(GetValue(expr))

    3. 如果 oldValuetrue,则返回 false

    4. 返回true

    and:

    9.2 ToBoolean

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

    表 11 - ToBoolean 转换

    参数类型 - 结果

    ...

    对象 - true

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2022-11-20
    • 2012-06-12
    • 2018-10-17
    • 2021-10-08
    • 2015-01-16
    • 2010-12-22
    相关资源
    最近更新 更多