5

以下比较都false在 javascript 中返回:

[]===[]
[]==[]
{}==={}
{}=={} 
[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/

4

3 回答 3

9

这是由于令人困惑的规则,javascript 如何进行类型强制。您可以在EcmaScript 5 规范的第 11.9.3节中了解这一点。

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

第二块更难:

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

当比较涉及布尔值时,首先将其强制为一个数字。

[]==false
[]==0

之后,通过调用将对象强制为其原始值Object.prototype.toString

"" == 0

然后字符串被强制转换为一个数字(""变成0

0 == 0

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

请注意,这===永远不会导致类型强制,而是首先检查正确的类型,如果它们不相等则返回 false!只有当类型相等时,它才会比较实际值。所以这种比较方法远比==.

于 2012-12-13T09:25:03.280 回答
4

产生的所有示例都false可以很容易地解释为,如果您正在比较对象(并且数组是特殊对象),JavaScript 将比较对象引用。当您使用所有这些比较创建新对象时,所有对象都将指向不同的对象,因此结果将为false.

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

一个操作数是数字或布尔值也是如此,这解释了最后两次比较的结果。

有关更多信息,请查看相应的 MDN 页面

引用重要部分:

相等 (==)

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

于 2012-12-13T09:24:36.073 回答
3

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

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

于 2012-12-13T09:25:55.580 回答