为什么"" == [null]在JavaScript中是真的吗?

时间:2014-08-27 15:39:25

标签: javascript

我知道JavaScript在类型之间进行比较有很多疯狂的结果,但我并不完全理解为什么。今天碰到了这个。

为什么

"" == [null]

在JavaScript中评估为true

更多Javascript平等娱乐,感谢@Qantas:

6 个答案:

答案 0 :(得分:76)

"Abstract Equality Comparison Algorithm"有很多部分,但重要的是:

  

如果Type( x )是String或Number而Type( y )是Object,   返回比较结果 x == ToPrimitive( y )。

(也有镜像也是如此。)因此,因为""是一个字符串而[null]是一个对象,所以我们必须先将[null]转换为一个字符串致电ToPrimitive([null])。当要求将Object实例转换为原始值时,这是一个如下所述的内部操作:

  

返回Object的默认值。通过调用对象的[[DefaultValue]]内部方法,传递可选提示 PreferredType 来检索对象的默认值。 [[DefaultValue]]内部方法的行为由本规范为8.12.8中的所有本机ECMAScript对象定义。

现在,[[DefaultValue]]内部操作将调用对象上的.toString()并返回该值。在浏览器控制台中尝试[null].toString()

> [null].toString()
""

你有它。

编辑:为什么[null].toString()是一个空字符串?因为对Array实例的.toString()操作始终只调用.join(),并且总是会产生nullundefined值的空字符串。因此,一个null的数组最终只是一个空字符串。

答案 1 :(得分:17)

根据Javascript的神秘type-conversion规则。规则#8:

  

如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。

因此,使用x = ""y = [null]ToPrimitive之间的比较转换为字符串。使用一个null元素转换数组会导致一个空字符串(因为Array.toString()返回一个以逗号分隔的值列表),因此它们的计算结果相等。

答案 2 :(得分:12)

  

为什么"" == [null]评估为真?

因为您正在使用non-strict equality operator ==将数组与字符串进行比较,所以它会在比较之前尝试将值转换为相同类型。

详细情况是:

  1. 将字符串与对象进行比较,因此将对象强制转换为字符串:
  2. 当数组转换为原始值时,会调用它的.toString()方法(正如其他答案详细解释的那样),这相当于调用.join()
  3. 如果是单元素数组,只包含undefinednullreturns the empty string
  4. 最终相当于空字符串
  5. 第三步是意外的一个([null]+"" != null+""),如果它实际上将其强制转换为字符串,结果将是"null"并且您的等式为假。

答案 3 :(得分:2)

让我们看看规范并完成每个步骤

通过Abstract Equality Comparison Algorithm (§11.9.3)

  1. typeof ""; // stringtypeof [null]; // object因此不适用
  2. nullundefined都不适用
  3. 与2
  4. 相同
  5. 既不是数字,也不适用
  6. 与4相同
  7. 既不是布尔,也不适用
  8. 再次不适用
  9. 最后,适用的东西,现在我们需要知道ToPrimitive([null])
  10. 对于对象

    §9.1 ToPrimitive说我们需要解决[[DefaultValue]] (§8.12.8),其中第1和第2点说你是否可以.toString并且它给出了一个字符串,返回那个,所以

    [null].toString(); // ""
    

    因此,我们现在通过抽象等值比较算法第1点执行"" == "" true的比较.d。

      

    如果Type(x)字符串,那么如果truex完全相同的字符序列(相同的长度和相同的字符串),则返回y相应位置的字符)。否则,请返回false

答案 4 :(得分:1)

JavaScript是弱类型的;您可以使用以下方法获得错误结果:

"" === [null]

答案 5 :(得分:-1)

值null是一个JavaScript文字,表示null或" empty"值,即不存在对象值。它是JavaScript的原始值之一。

值null是一个文字(不是像undefined那样的全局对象的属性)。在API中,通常在可以预期对象但没有对象相关的位置检索null。检查null或undefined时要注意相等(==)和identity(===)运算符之间的差异(使用前者执行类型转换)。

typeof null        // object (bug in ECMAScript, should be null)
typeof undefined   // undefined
null === undefined // false
null  == undefined // true