忘记是在什么情形下遇到了一个问题:
1 | null >= 0 //=> true |
在我过去的印象中,操作符会引起类型转换,如果一边是数字,另一边也应该转换为数字才对,但是代码的结果让我有限的大脑就陷入了沉思=L=
大概在Stack Overflow上查了查后,我得到了答案。
在关系比较符号对比两边时,遵循以下规则:
- 如果两边都是数字,则进行数值比较
- 如果两边都是字符串,则进行字符编码比较
- 如果一边是数字,则将另一边转换为数字比较
- 如果一边是布尔值,则会先转换为数值再比较
- 如果一边是对象,则会先调用
valueOf
,如果返回值不能转换为数值,则会基于该值调用toString
,然后再依据以上规则比较
这样就可以解释为什么null >= 0
结果是true
了,因为关系比较符的一边是数字,因此将null
转换为数字进行了比较,0 >= 0
当然是true
了
但在相等操作符比较时,又有些不同:
- 首先,
null
==undefined
,因为undefined派生自null
- 在比较相等性之前,不能将
null
和undefined
转换为其他的值 - NaN与任何值都不相等,包括他自己
- 如果两边都是对象,则比较对象的指向
根据第二点,可以得出为什么null
和0
不相等,因为没有发生类型转换,同理undefined == 0
答案也是false
。 我们可以说null
和undefined
,除了对方和自己,和任何类型都是不等的
顺便一提,Object.is
也可以用来进行比较,它比较接近于全等,不同点在于
1 | Object.is(NaN, NaN) //=> true |