为什么[] === [](和其他人)在javascript中返回false?

时间:2012-12-13 09:18:28

标签: javascript casting comparison

以下比较全部在javascript中返回false

[]===[]
[]==[]
{}==={}
{}=={} 
[0]===[0]
[0]==[0]

但是以下返回true

[0]=='0'
[0]==0
[]==false //(and all other == that were exampled above)

这是什么原因?特别是[0]!=[0][0]==0

之间的差异

小提琴:http://jsfiddle.net/vnBVj/

3 个答案:

答案 0 :(得分:9)

这是由于混乱的规则,javascript如何键入强制。您可以在EcmaScript 5规范的§11.9.3中阅读此内容。

两个对象(也是数组)永远不会相等,因此第一个块中的所有比较都会产生错误(§11.9.3.1.c.vi)

第二块更难:

首先要知道的是,==使用类型强制来比较操作数。

如果比较涉及布尔值,则首先将此布尔强制转换为数字。

[]==false
[]==0

之后,通过调用Object.prototype.toString

将对象强制转换为原始值
"" == 0

然后该字符串与一个数字相交(""成为0

0 == 0

产生真实。通过应用相同的规则,您可以看到为什么您的其他示例也会产生真实。

请注意===永远不会导致类型强制,但首先检查正确的类型,如果它们不相等则会产生错误!仅当类型相等时,才比较实际值。因此,这种比较方法比==更可靠。

答案 1 :(得分:4)

导致false的所有示例都可以通过以下事实轻松解释:如果您要比较对象(并且数组是特殊对象),JavaScript将比较对象引用。当您使用所有这些比较创建新对象时,所有对象都将指向不同的对象,因此结果将为false

至于[0]=='0':只要一个操作数是一个字符串,另一个操作数也会转换为字符串。 <{1}}的字符串转换为[0],因此结果为真。

同样适用于一个操作数是数字或布尔值,这解释了最后两个比较的结果。

有关详细信息,请查看respective MDN page

引用重要部分:

  

等于(==)

     

如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是字符串,则另一个操作数将转换为字符串(如果可能)。如果两个操作数都是对象,那么JavaScript会比较内部引用,当操作数引用内存中的同一个对象时,它们是相等的。

答案 2 :(得分:3)

使用litteral数组/对象初始化时,即使它是空的,也会创建一个新对象并返回它的引用。因此,当您比较它们时,您将比较您创建的对象的引用值。

您的其他示例返回true,因为您正在比较不同类型的变量,因此,对象/数组将进行转换以与它们进行比较。