2020-12-24 JS中的相等性比较方法

2020-12-24 JS中的相等性比较方法

==方法

1、两个复合类型(对象、数组、函数)比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址,所以两个对象总是不相等的

[] == [] // false
{} === {} // false
(function(){} === function(){}) // false

2、两侧类型不相同时,会发生隐式转换

  • NaN和其它任何比较永远false,包括它自己

    NaN == NaN // false
    
  • Boolean和其它任何比较,首先被转换成Number

    true == 1  => 1 == 1 // true
    true == '2' => 1 == 2  // false
    true == ['1'] => 1 == 1 // true
    true == ['2'] => 1 == 2 // false
    
    undefined == false => undefined == 0 // false
    null == false => null == 0 // false
    

    这部分强制转换请转到我的另外一条博客里:https://blog.csdn.net/xumaozeng/article/details/106782358

  • StringNumber比较,先将String 转为Number类型

    123 == '123' => 123 == 123 // true
    '' == 0 => 0 == 0 // true
    
  • nullundefined比较结果是true,除此之外,nullfalse与其它任何值比较都是false

    null == undefined // true
    null == '' // false
    null == 0 // false
    null == false // false
    undefined == '' // false
    undefined == 0 // false
    undefined == false // false
    
  • 原始类型和引用类型比较,对象还按照ToPrimitive规则转换为原始类型

    '[object Object]' == {} // true
    '1,2,3' == [1,2,3] // true
    [] == ![] => [] == false => 0 == 0 // true
    [null] == 0 // true
    [undefined] == 0 // true,这两个都会被当成空数组处理
    

===方法

这个严格相等性方法和上面不同点是,不会进行强制转换,先判断类型是否相等,在判断值是否相同,不过也有特殊情况将数字-0和+0视为相等,NaN总是不等于自身

Object.is(value1, value2)方法

该方法判断两个值是否为同一个值,返回一个Boolean
有以下条件返回true

  • 都是undefined

  • 都是null

  • 都是true或false

  • 都是相同长度的字符串且相同字符按相同顺序排列

  • 都是相同对象(有同一个引用)

  • 都是数字且

      - 都是+0
      - 都是-0
      - 都是NaN
      - 或都是非0而且非NaN且为同一个值
    

== 运算不同,== 运算符在判断相等前对两边的变量(如果它们不是同一类型)进行强制转换(这种行为结果会将'' == false判断为true),而Object.is()不会强制转换两边值

=== 运算也不同,=== 运算(包括== 运算符)会将数字+0-0 视为相等,而将NaNNaN视为不相等,而Object.is()正好相反

MDN源码(polyfill)

if (!Object.is) {
  Object.is = function (x, y) {
    if (x === y) {
      // +0 != -0;
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // NaN == NaN
      return x !== x && y !== y;
    }
  };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值