[] == false //true
![] == false //true
发现这件事的时候非常的疑惑,按理来说对象和数值比较,要先给对象转换成数值的方式来看 [] 是被转成 0 了也就是 Number([].valueOf()) == false ,所以 [] == false 结果为 true 这是比较容易理解的。但是 ![] == false 的结果竟然也是 true ,如果直接写上数据类型转换,再按照非运算取反的方式 !Number([].valueOf()) == false 结果等于 false 是没问题的,但如果直接 ![] == false 得到的结果就是 true。
重点:这里 ![] == false 得到的结果就是 true 的主要原因是
- 根据运算符优先级 ,
!的优先级是大于==的,所以先会执行![],这就导致还没有执行==相等比较操作,就没必要执行数据类型转换,而是直接以 ! 的定义来得到结果。 !的定义:除了取反也可将变量转换成boolean类型。null、undefined、NaN以及空字符串('')取反都为true,其余都为false。所以![]运算后的结果就是false