前几天写测试的时候,有个地方需要检查 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 会先进行类型转换,再进行值的比较。
而使用===
时,只要类型不同就为 false
Object.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 辣鸡的原因,哈哈
js
1 === 1;// true+0 === -0;// true1 / +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)
只有在这个范围内的数才能保证一定是正确的。
超出范围的数可能由于精度丢失还是什么别的原因,不一定正确,典型的例子:
js
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true
🙄
- https://facebook.github.io/jest/docs/en/expect.html#tobevalue↩
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is↩
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity↩
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER↩