Object.is()
前几天写测试的时候,有个地方需要检查Object的reference是否改变,jest中的toEqual(value)
是deep compare,不适用于reference,于是查看了一下应该使用toBe(value)
。
toBe
just checks that a value is what you expect. It usesObject.is
to check exact equality.^1
以前没见过也没用过Object.is
,查了一下发现是ES6的新语法^2
Object.is(val1, val2)
Object.is
方法用于比较两个对象是否相同,与==
和===
是有一定区别的
在使用==
时,如果等号两边类型不同,js会先进行类型转换,再进行值的比较。
而使用===
时,只要类型不同就为falseObject.is
在大多数情况下可以等同于===
,但有两种情况除外
+0
/-0
===
无法区分+0
和-0
Object.is(+0, -0)
返回false
可以区分
NaN
- 无法用
===
来进行检查,需要使用isNaN()
方法 - 但现在也可以用
Object.is(NaN, NaN)
来检查
- 无法用
Magic JS
原来除了0.1+0.2=0.00000000000034
这样的,还有其他搞笑的事情存在,可能这就是that’s why I love js?写的不好的时候就可以blame是JS辣鸡的原因,哈哈1
2
3
4
5
61===1;
// true
+0===-0;
// true
1/+0===1/-0;
// false
Infinity ^4
Infinity
是比任何数都大的数, 在运算上与数学上的Inf一样
需要注意:
Infinity / Infinity
->NaN
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
Number.MAX_SAFE_INTEGER ^5
本来只是想研究一下Object.is
的,没想到顺带就又引申出了这么多其他的东西…上面提到Infinity
,很容易联想到那么JS中最大的数是多大呢
JS中有Number.MAX_SAFE_INTEGER
,其值为2^53 - 1
,对应的最小数Number.MIN_SAFE_INTEGER
,其值为-(2^53 - 1)
只有在这个范围内的数才能保证一定是正确的。
超出范围的数可能由于精度丢失还是什么别的原因,不一定正确,典型的例子:1
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 // true
🙄