为什么 [] == ![] 输出是true?

看到群里发的一个问题,为什么 [] == ![] 输出是true?

看到了第一反应是黑人问号脸?但是得信,JavaScript无所不坑,就试着去寻找答案。

  1. ! 的优先级比 == 要高,所以会先执行 ! [] 。

    ! [] :是[]取反,[]的转换成布尔值类型是:true ,因为:空字符串' ',undefined, null, 0,NaN。除了这5个外,其他所有值转布尔类型都是true。
    因此:右边 ![] 变成了 false

  2. 当==两边其中一个是布尔值的话,先把布尔值转换为数字。false转换成数字是0
    因此:右边 ![] 变成了 0

  3. 当==的一边是字符串或数字,另一边是对象的时候(数组也是对象),先把对象值转换为原始值再判断相等。

    步骤如下:

    • 对象先调用valueOf()方法,如果此方法返回的是原始值,则对象转为这个原始值。

    • 如果valueOf方法返回的不是原始值,则再调用toString方法,如果toString方法返回的是原始值,则对象转换为这个原始值。

    • 如果valueOf和toString方法均没有返回原始值,则抛出异常。

    这里左边[]调用valueOf方法即[].valueOf() 返回的是:[] ;

    继续调用toString方法即[].toString() 返回的是:'' 空字符串

  4. 现在左边就是'' 右边是 0
    两边一个是字符串一个是数字的时候,先把字符串转为数字,再进行比较。空字符串 '' 转成数字为0

  5. 最后就变成了 0 == 0 这肯定是true。

    原来答案就是这么来的。

posted @ 2021-01-05 20:50  liaoing  阅读(240)  评论(0编辑  收藏  举报