操作符

Posted by Eleanor Mao on 2017-05-15

忘记是在什么情形下遇到了一个问题:

1
2
3
null >= 0 //=> true
null == 0 //=> false
Number(null) === 0 //=> true

在我过去的印象中,操作符会引起类型转换,如果一边是数字,另一边也应该转换为数字才对,但是代码的结果让我有限的大脑就陷入了沉思=L=

大概在Stack Overflow上查了查后,我得到了答案。

关系比较符号对比两边时,遵循以下规则:

  • 如果两边都是数字,则进行数值比较
  • 如果两边都是字符串,则进行字符编码比较
  • 如果一边是数字,则将另一边转换为数字比较
  • 如果一边是布尔值,则会先转换为数值再比较
  • 如果一边是对象,则会先调用valueOf,如果返回值不能转换为数值,则会基于该值调用toString,然后再依据以上规则比较

这样就可以解释为什么null >= 0结果是true了,因为关系比较符的一边是数字,因此将null转换为数字进行了比较,0 >= 0当然是true

但在相等操作符比较时,又有些不同:

  • 首先,null == undefined,因为undefined派生自null
  • 在比较相等性之前,不能将nullundefined转换为其他的值
  • NaN与任何值都不相等,包括他自己
  • 如果两边都是对象,则比较对象的指向

根据第二点,可以得出为什么null0不相等,因为没有发生类型转换,同理undefined == 0答案也是false。 我们可以说nullundefined,除了对方和自己,和任何类型都是不等的

顺便一提,Object.is也可以用来进行比较,它比较接近于全等,不同点在于

1
2
Object.is(NaN, NaN) //=> true
Object.is(-0, +0) //=> true