JS中判断是否相等的方式以及区别

204 阅读2分钟

判断JS相等的3中方式:

1.宽松相等 ==
2.严格相等 ===
3.ES6新增的 Object.is()

三者在比较方面的区别:

  • 宽松相等:
    在宽松相等中,在进行比较时候,会经过以下几个步骤(类型的隐式转化):
    1. 首先进行判断类型是否相同,如果相同,则直接进行比较,如果不相同,则进入下一步。

    2. 判断是不是nullundefined,如果是,则直接返回true,如果不是,进入下一步

    3. 判断是不是StringNumber,如果是,则将String转化为Number 后进行比较,如果不是则进入下一步

    4. 判断是不是Boolean其他类型,如果是,则将Boolean 转化为 Number 后进行比较,如果不相等进入下一步

    5. 判断是否为对象与非对象,如果是,为对象的一方则会调用对象的valueOf()方法,调用完valueOf()方法后,若还是对象,则调用toString(),如果还为非对象,抛出错误,转化完之后,若是不相等,则进行下一步

      • valueOf()返回值对照表
          1. Array: 数组本身
          2. Boolean: 布尔值
          3. Date: 毫秒数 
          4. Function: 函数本身
          5. Number: 数字值
          6. Object: 对象本身
          7. String: 字符串值
        
      • toString()方法不太好描述,建议读者去MDN上搜索此方法
    6. 若是对象与对象,则直接判断指向地址是否相同,若相同,则相等,若不相同则不等

  `注:每次类型转化后,都会重新从条件1开始进行再次判断`

宽松相等的例子:

  • [] == 0

    1. 满足上述条件5,[]为对象,则执行valueOf(),返回的是数组本身,继续执行toString(),返回值为''空字符串
    2. 等式变为 '' == 0,符合条件3的要求,则将''空字符串转化为数字,Number('') = 0,
    3. 等式变为0 == 0,符合条件1,类型相等,则直接比较,返回true
  • [] == true

    1. 满足条件4,则先将Boolean值转化为数字
    2. 等式变为 [] == 1,满足等式5,执行valueOf()方法,返回的是数组本身,则继续执行toString()方法,返回的是''
    3. 等式变为'' == 1,满足条件3,则将''转化为Number类型,
    4. 0 == 1,返回false
  • [4,5] == '4,5'

    1. 满足条件5,执行vaueOf()方法,返回数组本身,则继续调用toString()方法,返回'4,5'
    2. 等式变为 '4,5' == '4,5',满足条件1,直接进行比较。返回true
  • 严格相等:

    1. 严格相等在进行判断的时候,不会进行类型的隐式转化,也就是说,在严格模式下, '0' === 0false
    2. 在严格相等下,存在两个特殊的情况,那就是 -0 === +0true 以及 NaN === NaNfalse
  • Objcet.is():

    1. Objcet.is()基本与严格相等类似,并且对严格相等中的
      -0 === +0 以及 NaN === NaN 进行了更正,
    2. Objcet.is()-0 === +0false 以及 NaN === NaNtrue