为什么 ![] == false 结果是 true ?

486 阅读1分钟
[] == false //true
![] == false //true

发现这件事的时候非常的疑惑,按理来说对象和数值比较,要先给对象转换成数值的方式来看 [] 是被转成 0 了也就是 Number([].valueOf()) == false ,所以 [] == false 结果为 true 这是比较容易理解的。但是 ![] == false 的结果竟然也是 true ,如果直接写上数据类型转换,再按照非运算取反的方式 !Number([].valueOf()) == false 结果等于 false 是没问题的,但如果直接 ![] == false 得到的结果就是 true

重点:这里 ![] == false 得到的结果就是 true 的主要原因是

  1. 根据运算符优先级 ,! 的优先级是大于 == 的,所以先会执行 ![],这就导致还没有执行 == 相等比较操作,就没必要执行数据类型转换,而是直接以 ! 的定义来得到结果。
  2. ! 的定义:除了取反也可将变量转换成 boolean 类型。nullundefinedNaN 以及空字符串 ('') 取反都为 true ,其余都为 false 。所以 ![] 运算后的结果就是 false