Javascript 使用“!=”比较对象和布尔值的结果不同及`==`

Javascript 使用“!=”比较对象和布尔值的结果不同及`==`,javascript,equality,Javascript,Equality,我很难理解JavaScript中相等运算符的行为。这是我在浏览器控制台上运行以下命令时得到的结果: new Object() == true // returns false new Object() != false // returns true 现在,我不同意一个对象应该是假的这一事实(尽管我在检查后理解了原因),但真正困扰我的是,我在两个等价的逻辑表达式上得到了两个不同的结果 发生了什么事?您链接到的内容给出了一个10步列表,根据左侧和右侧的内容进行检查 左侧是一个对象。右边是布尔值

我很难理解JavaScript中相等运算符的行为。这是我在浏览器控制台上运行以下命令时得到的结果:

new Object() == true  // returns false
new Object() != false // returns true
现在,我不同意一个对象应该是假的这一事实(尽管我在检查后理解了原因),但真正困扰我的是,我在两个等价的逻辑表达式上得到了两个不同的结果

发生了什么事?

您链接到的内容给出了一个10步列表,根据左侧和右侧的内容进行检查

左侧是一个对象。右边是布尔值

这意味着它将进入步骤10:

返回false


一个对象不等于
true
,也不等于
false

根据规范,这两者都应该返回
false
(这与我的常识一致):

基于:

  • 如果类型(x)是对象,类型(y)是字符串或数字, 返回比较结果ToPrimitive(x)==y

  • 返回false

  • 因为它们都返回false和:

    A!=B相当于!(A==B)

    这两项都应该是
    真的

    new Object() != true  // true
    new Object() != false // true
    
    注:
    这不应该与
    新对象()的真实性相混淆。换句话说,
    newobject()==true
    与布尔值(newobject())==true不一样发生了什么事?
    您使用的是草率的等式。相反,使用严格的平等,事情将更加可预测。(还要注意的是,对象永远不会等于除自身以外的任何东西,松散或严格)它不是严格相等,yes对象不是false,但它也不是true,如果使用布尔构造函数,则应该正确地执行
    =检查值。例如:
    '5'!=5
    将返回false。但是当文档说明
    0
    -0
    null
    false
    NaN
    未定义的
    ,或空字符串的计算结果为
    false
    ,而其他所有内容均为
    true
    ,则返回false,这不应该包括对象吗?那么你的意思是对象既不是
    真的
    也不是
    假的
    ,但正如马克·迈耶在另一个回答中所说,它的布尔转换总是
    true
    ?@玩世不恭-比较true或false并不等于将其作为参数传递给布尔构造函数。我明白你的意思,但你能扩展一下你的最后一个注释吗?为什么这两种说法不一样?
    新对象
    是否应该自动强制转换为
    布尔值
    ?@愤世嫉俗的是,当左手是对象而右手不是字符串或数字时,规范没有说明如何强制转换。所以它不应该被强制转换——它应该返回false。将对象强制转换为布尔值确实会在其他上下文中发生,但就像在测试对象是否真实而不是相等的上下文中一样。
    new Object() != true  // true
    new Object() != false // true