美文网首页
在js中,为什么[] == [] 为false, [] == !

在js中,为什么[] == [] 为false, [] == !

作者: 前端划水工 | 来源:发表于2019-12-19 16:51 被阅读0次

    1. [] == ![] 为什么为true?

    转换规则:在比较运算符时会优先转换操作数(强制转换),然后再进行比较。
    第一步:如果有一个操作数类型为布尔值,则在比较相等之前将其转换为数值类型,即 false => 0, true => 1;
    第二步:如果一个操作数是字符串,另一个是数值,在比较前先将字符串转换成数值
    第三步:在双等号对比时,左右类型相等的情况下,采用三等号的方式进行比较,严格的运算符判定规则

    通过上面的转换规则, ![] 的类型为布尔值 typeof ![] === 'boolean', 那么会变成 false, 根据第一步,false => 0 ,所以右侧为 0,接下来因为右侧是0,按照第二步的规则,右侧为0满足的条件,左侧的[],被转化为Number([]) => 0, 两边都为0,则返回为 true

    2. [] == [] 为什么为false?

    此时的情况满足上转换规则的第三步,在双等号左右两边的类型相等时,采用三等号进行判定

    对于对象-数组属于对象,只看双方的地址,地址一样则返回为true,反则为false

    此时的==号两边的地址是不一样的,所以返回为false

    3. {} == !{} 为什么为false?

    有了上面两个经验,不难看出, !{}为布尔类,将转换为0, 因为右边为转换成数值类,所以左边Number({}) => NaN, NaN连自己都不相等,所以为false

    4. null == undefined 为什么为true?

    以上三种规则都不满足,在javascript规范中找到了答案

    规范中提到: 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。

    Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。
    undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined
    实际上,undefined值是派生自null值的,ECMAScript标准规定对二者进行相等性测试要返回true,

    常见类型

    typeof 转换类型 结果
    {} object
    [] object
    null object
    undefined undefined
    NaN number
    0 number
    true boolean
    ' ' string
    Number转换 结果
    Number({}) NaN
    Number([]) 0
    Number('') 0
    Number(null) 0
    Number(undefined) NaN
    Number(NaN) NaN

    相关文章

      网友评论

          本文标题:在js中,为什么[] == [] 为false, [] == !

          本文链接:https://www.haomeiwen.com/subject/obzmnctx.html