以下比较全部在javascript中返回false
:
[]===[]
[]==[]
{}==={}
{}=={}
[0]===[0]
[0]==[0]
但是以下返回true
:
[0]=='0'
[0]==0
[]==false //(and all other == that were exampled above)
这是什么原因?特别是[0]!=[0]
和[0]==0
答案 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,因为您正在比较不同类型的变量,因此,对象/数组将进行转换以与它们进行比较。