JavaScript中相等的区别

对于js中相等性的比较总是一知半解,对于一些特殊的比较犹豫不决,仔细学习后其实很容易比较的,记录一下吧~

提问:

1.NaN == NaN

2.NaN === NaN

3.{} == {}

4.{} === {}

5.[] == []

6.[] === []

7.+0 === -0

8.Number(‘1’) === 1

9.Object.is(NaN,NaN)

10.Object.is(+0,-0)

11.null == undefined

12.null === undefined

13.’1′ == Number(‘1’)

这些你都答对了吗?如果对了就不必看啦,本文主要解决以上问题。

答案:1.false 2.false 3.false 4. false 5. false 6. false 7.true 8.true 9.true 10.false 11. true 12.false 13.true

正文开始

严格相等比较(===):

严格相等比较需要比较值是否相同值的类型是否相同

抽象相等比较(==):

抽象相等比较在比较前会进行类型的隐式转换,转化成相同类型,我们只需要关注值是否相同

Object.is

Object.is()和 === 比较方式一样,但是对于NaN和-0和+0进行特殊处理。只需要记住:

  1. Object.is(NaN,NaN)为 true
  2. Object.is(+0,-0)为 false

那么反过来想 === 和 == 就是相反的,哈哈哈哈

解答一下上面的问题:

  • 对于NaN的比较,不管是 == 还是 === 都是false。NaN用来表示某些定义不明确的数学问题的解:比如1+正无穷2+正无穷都是NaN。全等操作符认为 NaN 与其他任何值都不全等,包括它自己。(等式 (x !== x) 成立的唯一情况是 x 的值为 NaN)。所以1,2都是false

  • 对象和数组的比较,虽然表面看起来他们的类型相同,值也相同(都为空)但是像对象,数组这样的引用类型的数据,他们是经过内存调用进行比较的,还要判断他们的内存地址是否指向同一地址。所以对象和数组的比较3,4,5,6都是false

  • 0的比较,浮点数 0 是不分正负的。区分 +0 和 -0 在解决一些特定的数学问题时是必要的,但是大部分情况下我们并不用关心。全等操作符认为这两个值是全等的。所以只在Object.is中作了特殊处理。7为true,10为false

  • 关于null和undefined比较。在JavaScript规范中提到,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。null 和 undefined都代表着无效的值。null == undefined。但是null和undefined数据类型不同,所以null !== undefined.所以11为true,12为false。

  • 最后看看8.Number('1') === 1和13.'1' == Number('1')

    Number(‘1’) === 1 : 先将字符串1转化成了Number类型,所以Number(‘1’) 和 1 的类型相同,并且数值相同,所以全等为true

    ‘1’ == Number(‘1’) : 虽然是字符串和数字类型的比较,但是 == 不会比较类型,只关注数值是否相同,所以为true。

总结

  • 把需要记住的记住了:

    1. Object.is(NaN,NaN)为 true
    2. Object.is(+0,-0)为 false
    3. null == undefined
    4. NaN !== NaN / NaN != NaN
    5. +0 == -0 / +0 === -0
  • 对象和数组这样引用类型的数据,需要看引用地址的,不同的对象或者数组他们的引用地址不同,所以不等

  • 只要数据类型不同,=== 就为false

好了,结束啦~

如有问题感谢指正~

如果对你有帮助就点赞,关注、收藏吧~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享