对于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进行特殊处理。只需要记住:
- Object.is(NaN,NaN)为 true
- 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。
总结
-
把需要记住的记住了:
- Object.is(NaN,NaN)为 true
- Object.is(+0,-0)为 false
- null == undefined
- NaN !== NaN / NaN != NaN
- +0 == -0 / +0 === -0
-
对象和数组这样引用类型的数据,需要看引用地址的,不同的对象或者数组他们的引用地址不同,所以不等
-
只要数据类型不同,=== 就为false
好了,结束啦~
如有问题感谢指正~
如果对你有帮助就点赞,关注、收藏吧~