Object.is() #47

Posted 2 years ago · 1 mins reading

前几天写测试的时候,有个地方需要检查 Object 的 reference 是否改变,jest 中的toEqual(value)是 deep compare,不适用于 reference,于是查看了一下应该使用toBe(value)

toBe just checks that a value is what you expect. It uses Object.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;
// 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) 只有在这个范围内的数才能保证一定是正确的。

超出范围的数可能由于精度丢失还是什么别的原因,不一定正确,典型的例子:

js
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true

🙄