当前位置 : 主页 > 手机教程 > 手机资讯 >

JavaScript相等判断的避坑实战指南

来源:互联网 收集:自由互联 发布时间:2023-01-20
目录 JS中的相等性 1、严格相等(===) 2、非严格相等(抽象相等)(==) 3、同值相等 4、零值相等 Object.is()实现方案 总结 JS中的相等性 1、严格相等(===) 严格相等本质上是判断一个值是否与自身
目录
  • JS中的相等性
    • 1、严格相等(===)
    • 2、非严格相等(抽象相等)(==)
    • 3、同值相等
    • 4、零值相等
  • Object.is()实现方案
    • 总结

      JS中的相等性

      1、严格相等(===)

      严格相等本质上是判断一个值是否与自身相等,在比较前不进行隐式类型转换。当被比较的两个值类型相同,值也相同,且不是Number类型时,这两个值是全等的。当两个值类型是Number时,我们需要注意NaN,NaN和NaN不相等,+0和-0全等,其余情况,只要值相等,就是全等的。

      NaN === NaN //false
      +0 === -0 // true
      undefined === undefined //true
      null === null //true
      undefined === null //false
      ({}) === {} //false
      3 === '3' //false
      3 === 3 //true
      true === true //true
      false === 0 //false

      2、非严格相等(抽象相等)(==)

      判断比较的两个值是否相等,在比较前会转化为相同的类型,转换类型后,和严格相等(===)比较规则一致。

      比较规则(A/B)undefinednullNumberStringBooleanObjectundefinedtruetruefalsefalsefalsefalsenulltruetruefalsefalsefalsefalseNumberfalsefalseA === BtoNumber(B)===AtoNumber(B)===AtoPrimetive(B) == AStringfalsefalsetoNumber(A)===BA===BtoNumber(A)===toNumber(B)toPrimetive(B) == ABooleanfalsefalsetoNumber(A)===BtoNumber(A)===toNumber(B)A===BtoPrimetive(B) == toNumber(A)ObjectfalsefalsetoPrimitive(A) == BtoPrimitive(A) == BtoPrimetive(A) == toNumber(B)A===B
      null == undefined // true
      null == 0 // false
      null == '' // false
      null == 'null' //false
      null == false // false
      null == [] //false
      null == {} //false
      null == NaN //false
      undefined == 0 //false
      undefined == '' //false
      undefined == 'undefined' //false
      undefined == false //false
      undefined == [] //false
      undefined == {} //false
      undefined == NaN //false
      '' == 0 //true
      '' == false //true
      '' == [] //true
      '' == {} // false
      0 == false // true
      0 == [] // true
      0 == {} // false
      true == '1' //true
      true == 'true' //false
      true == 1 // true
      true == [] //false
      false == [] //true
      true == {} //false
      ([]) == [] //false
      ({}) == {} //false
      3 == '3'  //true
      NaN == NaN // false
      +0 == -0 // true

      总结规律可得: undefined和null认为值相等,但是当undefined和null与其他类型进行相等比较时,不进行隐式类型转换,与其他的任何类型值都不相等,所有对象与undefined和null不相等,但是有个特例,如:document.all == undefineddocument.all == null均为true

      严格相等和非严格相等比较可得:严格相等的结果更具预测性,且无需进行类型转换,效率也更高

      3、同值相等

      同值相等是用来判断两个值是否是同一个值,通过Object.is()来判断,是es6新方法。有点类似于严格相等,不会对传入的两个参数值进行隐式类型转换,但是与严格相等又不完全相同,在对待+0、-0以及NaN上不一致

      • 都是undefined
      • 都是null
      • 相同的两个字符串
      • 都是true或者都是false
      • 引用值相同的两个对象
      • 都是NaN
      • 都是不为NaN且不为0的值相同的数字
      • 都是+0或者都是-0
      Object.is(NaN, NaN) //true
      Object.is(NaN, 0 / 0) // true
      Object.is(+0, -0) // false
      Object.is(+0, +0) //true
      Object.is(undefined, undefined) //true
      Object.is(null, null) //true
      Object.is(undefined, null) //false
      Object.is({}, {}) //false
      Object.is(3, '3') //false
      Object.is(3, 3) //true
      Object.is(true, true) //false
      Object.is(false, 0) //false

      4、零值相等

      **与同值相等类似,认为+0和-0相等**

      Object.is()实现方案

      // 实现方案:
      Object.defineProperty(Object, "is", {
          value: function (x, y) {
              if (x === y) {
                  // 需要区分一下+0和-0
                  return x !== 0 || 1 / x === 1 / y
              } else {
                  // 需要区分一下NaN
                  return x !== x && y !== y
              }
          }
      })

      总结

      到此这篇关于JavaScript相等判断避坑的文章就介绍到这了,更多相关JavaScript相等判断避坑内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

      上一篇:VScode中配置JavaScript编译环境的方法
      下一篇:没有了
      网友评论