看到群里发的一个问题,为什么 [] == ![] 输出是true?
看到了第一反应是黑人问号脸?但是得信,JavaScript无所不坑,就试着去寻找答案。
-
! 的优先级比 == 要高,所以会先执行 ! [] 。
! [] :是[]取反,[]的转换成布尔值类型是:true ,因为:空字符串' ',undefined, null, 0,NaN。除了这5个外,其他所有值转布尔类型都是true。
因此:右边 ![] 变成了 false -
当==两边其中一个是布尔值的话,先把布尔值转换为数字。false转换成数字是0
因此:右边 ![] 变成了 0 -
当==的一边是字符串或数字,另一边是对象的时候(数组也是对象),先把对象值转换为原始值再判断相等。
步骤如下:
-
对象先调用valueOf()方法,如果此方法返回的是原始值,则对象转为这个原始值。
-
如果valueOf方法返回的不是原始值,则再调用toString方法,如果toString方法返回的是原始值,则对象转换为这个原始值。
-
如果valueOf和toString方法均没有返回原始值,则抛出异常。
这里左边[]调用valueOf方法即[].valueOf() 返回的是:[] ;
继续调用toString方法即[].toString() 返回的是:'' 空字符串
-
-
现在左边就是'' 右边是 0
当两边一个是字符串一个是数字的时候,先把字符串转为数字,再进行比较。空字符串 '' 转成数字为0 -
最后就变成了 0 == 0 这肯定是true。
原来答案就是这么来的。