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

标签 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

的区别

fiddle :http://jsfiddle.net/vnBVj/

最佳答案

这是由于困惑的规则,javascript如何进行类型转换。您可以在 §11.9.3 中阅读相关内容符合 EcmaScript 5 规范。

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

第二 block 比较难:

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

当比较涉及 bool 值时,首先将其强制转换为数字。

[]==false
[]==0

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

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

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

0 == 0

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

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

关于javascript - 为什么 [] === [] (和其他人)在 javascript 中返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13856597/

相关文章:

c++ - 初始化中的指针转换

python - 使用Python转换JSON中具有相同键的值的数据类型

mysql - MySQL 中的空值比较

PHP语法问题

javascript - 使用 jquery 更改 div 中的特定背景图像

javascript - 在嵌套对象中继承此范围

javascript - 将 JS 图表库与 NodeJS 结合使用

c# - IEnumerable.Cast 不调用强制转换重载

c# - 比较类型的VALUE和REFERENCE

javascript - 尝试将 Bootstrap 添加到 Rails。需要安装nodejs吗?