最近发现一个有趣的比较表达式:
[] == ![] //结果是true
为什么会是true呢?好吧,先来看看下面这个:
[] == [] //结果是false
这个比较好理解,[]
相当于一个数组实例,那么两个实例使用==来比较是不相等的.
现在回到上面的表达式,先看表达式右边的操作数:逻辑非运算![]
的结果一定是布尔值,而[]
是一个数组对象实例,经过逻辑非运算之后结果是false
.那么就能知道其实上面的表达式可以写成
[] == false
当时就想,那么表达式就是将[]
转换成布尔值做比较了,发现Boolean([])
的值是true,true == false
的结果当然就是false了,所以这个解释是不对的.
继续查资料,在javascript高级程序设计
中关于==运算符的比较有这么一个规则:
如果比较运算符的操作数是布尔值的话,那么Javascript会将其转换成数字做比较,那么就能得出[] == false
可以写成
[] == 0
此时可以知道,在进行比较时左边的操作数会被转成数字类型的数据,Number([])
的结果是0,0==0
的结果是true.于是乎就能得出结论,[] == ![]
表达式比较的实质是进行数字的比较.