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

ric*_*uck 5 javascript comparison casting

以下比较所有falsejavascript 返回:

[]===[]
[]==[]
{}==={}
{}=={} 
[0]===[0]
[0]==[0]
Run Code Online (Sandbox Code Playgroud)

但是以下回报true:

[0]=='0'
[0]==0
[]==false //(and all other == that were exampled above)
Run Code Online (Sandbox Code Playgroud)

这是什么原因?尤其之间的差[0]!=[0][0]==0

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

Chr*_*oph 9

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

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

第二块更难:

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

当比较涉及布尔值时,首先将该强制转换为数字.

[]==false
[]==0
Run Code Online (Sandbox Code Playgroud)

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

"" == 0
Run Code Online (Sandbox Code Playgroud)

然后字符串被串联到一个数字(""变成0)

0 == 0
Run Code Online (Sandbox Code Playgroud)

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

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