【问题标题】:If an array is truthy in JavaScript, why doesn't it equal true?如果数组在 JavaScript 中为真,为什么它不等于真?
【发布时间】:2017-11-16 22:02:50
【问题描述】:

我有以下代码sn-p:

if([]) {
  console.log("first is true");
}

console 表示 first is true,这意味着 [] 是真的。现在我想知道为什么会这样:

if([] == true) {
  console.log("second is true");
}

还有这个:

if([] === true) {
  console.log("third is true");
}

不是true。如果控制台在第一个 sn-p 中记录了 first is true,这意味着 [] 应该是真的,对吧?那么为什么后两个比较会失败呢? Here 是小提琴。

【问题讨论】:

标签: javascript arrays comparison javascript-objects


【解决方案1】:

在对 Object 类型进行布尔公平检查之前,您有强制类型强制。

虽然 "" == false // <- true0 == false // <- true 效果很好

Object 类型则不然

null == false // <- false

所以你最好喜欢

!!null === false // &lt;- true!![] === true // &lt;- true

【讨论】:

    【解决方案2】:

    这是按规范。通过ECMAScript 2015 Language Specification,任何隐含为coerced into a boolean 的对象都为真;这意味着对象是真实的。在if 语句中,条件一旦被评估并且如果还不是布尔值,就会被强制转换为布尔值。因此,这样做:

    if([]) { 
      ... 
    }
    

    [] 在强制转换为布尔值时为真,并且为真。

    另一方面,当您尝试使用抽象比较 == 比较不同类型的两个值时,引擎必须在内部通过算法将值减少为相似类型,并最终减少它可以比较的整数。在Section 7.2.12 of the specification抽象平等比较的步骤x == y中,它指出:

    7.2.12 抽象等式比较

    比较 x == y,其中 xy 是值,产生 true。这样的比较是这样进行的:

    [...]

    1. 如果Type(y) 是布尔值,则返回比较结果x == ToNumber(y)。

    因此,y 操作数(在本例中为 true)通过 ToNumber 的强制转换为 1,因为它是一个布尔值,而 [] == 1 是 false,因为:

    1. 如果Type(x) 是对象并且Type(y) 是字符串、数字或符号,那么 返回比较结果ToPrimitive(x) == y

    这将使用数组的toString 方法将x 操作数转换为字符串,在这种情况下为空数组""。经过ToPrimitive后,会产生:

    if("" == 1) {
      ...
    }
    

    最后:

    1. 如果Type(x) 是字符串并且Type(y) 是数字, 返回比较结果ToNumber(x) == y

    因此,空字符串""ToNumber 为0,你得到:

    if(0 == 1) {
      ...
    }
    

    而且0不等于1,所以是假的。请记住,仅仅因为某事是真实的,并不等于真实。试试Symbol() == true({}) == true

    === 的最终比较是strict comparison,并且不强制任何操作数,如果两个操作数的类型不同,则返回false。由于左边的操作数是一个对象(一个数组)而右边是一个数字,所以比较结果为假。

    【讨论】:

      【解决方案3】:

      这是严格相等。这意味着两个操作数应该是相同的东西。在对象的情况下,它们应该是完全相同的对象。具有相同结构和相同值的对象之间的比较会失败,它们需要引用相同的对象才能成功。

      if([]===true){
        console.log("third is true");
      }
      

      对于不同类型的操作数,它们之间的比较变得严格。这导致了上述情况。

      if([]==true){
        console.log("second is true");
      }
      

      此外,在第一个 if 语句中,[] 会自动转换为布尔值 true。

      【讨论】:

      • 我真的不认为这实际上回答了这个问题;他们在问[] 是否真实,为什么[]==true 不是真实的。
      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多