• []==![]结果为true,探究 == 本质


    涉及面试题:== 和 === 有什么区别?

    对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,

    假如我们需要对比 x 和 y 是否相同,就会进行如下判断流程:

    • 首先会判断两者类型是否相同。相同的话就是比大小了
    • 类型不相同的话,那么就会进行类型转换
    • 会先判断是否在对比 null 和 undefined,是的话就会返回 true
    • 判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number
    1 == '1'1 ==  1
    
    • 1
    • 2
    • 3

    关于==与===的区别相信大家都很清楚啦,这理解不再赘述,今天我们来看下[]==![]的结果。

    []==[] //false,这个是常识,因为在两边都是相同数据类型时,==是直接比较两边数据,结果为false,因为[]属于引用类型,在两个[]分别指向不同的堆内存

    而当前这题:

    []==![]//true
    
    • 1

    这个结果是怎么的出来的呢?

    []==![]结果为true,探究 == 本质

    • 首先我们知道,的优先级要大于==的,所以先运算右边,![]-—>结果为false
    • 这样[]==![]就等价于于:

    再来看,这时候==两边数据类型就不相等辣,我们知道,当==两边数据类型不一致时,要先做数据类型转换,再判断,
    == 类型转换规则如下:[]==false

    值类型 `==` 值类型 //相当于 Number(值类型) == Number(值类型)
    
    • 1
    引用类型 == 值类型 // 对象转化成原始类型的值,再进行比较
    
    • 1

    比较规则: 数组与数值进行比较,会先转成数值,再进行比较;与字符串进行比较,会先转成字符串,再进行比较;与布尔值进行比较,两个运算子都会先转成数值,然后再进行比较。

    我们知道值类型之间==:

    'true' == true //false,Number('true')为NAN,Number(true)为1
    
    • 1

    那么本题值类型和引用类型之间==

    [] == false //相当于,Number([])为0,Number(false)为0,
    
    • 1

    所以0==0//true。

    过程:[]==![]  ---->   []==false   ----->   0==0   --->//true
    
    • 1

    其实更详细还可参考知乎上的一个回答:因为 [] 是对象,比较过程依ToPrimitive([]) == false
    比较。ToPrimitive 默认是调用 toString 方法的,于是 ToPrimitice([]) 等于空字符串,即''==false,然后ToNumber('')==0,即0==0,true。

  • 相关阅读:
    HUAWEI华为MateBook X Pro 2021款 i7 集显(MACHD-WFE9Q)原装出厂Win10系统20H2
    【NLP】第 7 章:使用序列到序列神经网络进行文本翻译
    8.MySQL DCL (数据控制语言) 语句
    Ubuntu18.04安装QGC报错 `GLIBC_2.29‘ not found
    Spring5源码解析系列一——IoC容器核心类图
    [附源码]计算机毕业设计JAVAjsp校园自行车租售管理系统
    某云负载均衡获取客户端真实IP的问题
    股票交易接口的移除元素
    前AMD芯片架构师吐槽,取消 K12 处理器项目是因为 AMD 怂了!
    【C++】基础语法(学习笔记)
  • 原文地址:https://blog.csdn.net/m0_46672781/article/details/126845109