先来看看这个会输出什么?
[12]==12;
这里大家可以先思考一下是返回false,还是true。
其实这是个很简单的问题,只是不太了解“==”和“===”的比较规则,所以就比较懵。
“==” 的比较规则
- 先检查两个操作数的数据类型是否相同
- 如果相同,则比较两个数是否相等
- 如果不同,则先将两个数转换为相同数据类型,再进行比较
上几个例子:
这里可以看到,数字型的 1 竟然与字符型的 ‘1’ 、数组 [1] 】布尔值 true 相等了,这是因为js自动进行了一次数据类型转换,将字符串、数组、布尔值转为数字,再进行比较。
“===”的比较规则
- 先检查两个操作数的数据类型是否相同
- 若不同,直接返回false
- 若相同,则比较二者是否相等
如下所示:
跟==不同,当数据类型不同时, 不进行数据类型转换,直接返回false
来看看复杂一点的:
null==undefined //true
null===undefined //false
NaN==NaN //false
NaN===NaN //false
对于null==undefined返回true,在《JavaScript高级程序设计》(第三版)中是这么写的:
实际上undefined值是派生自null值的,因此ECMA-262规定对他们的相等性测试要返回true
而NaN(not a number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,避免报错。NaN与任何值都不相等,包括NaN自身。
关于null和undefined的区别也是一个有意思的点,不是本文重点,有兴趣的同学自行百度,或者可以等我后续博客啦~