zoukankan      html  css  js  c++  java
  • 为什么 [] == ![] 输出是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。

      原来答案就是这么来的。

  • 相关阅读:
    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
    mybatis自定义枚举转换类
    javaweb分布式事务
    javaweb的负载均衡,tomcat集群和session共享
    分布式并发锁处理
    FindBugs规则整理
    SpringMVC中文乱码,字符过滤器配置
    mybatis快速入门
    黑盒测试常用的测试方法
    问题及解决方案小技巧
  • 原文地址:https://www.cnblogs.com/liaoing/p/14237880.html
Copyright © 2011-2022 走看看