object.is 是更严格、符合数学直觉的相等判断方法,解决 === 在 nan 和 +0/-0 上的反直觉问题:nan === nan 为 false 而 object.is(nan, nan) 为 true,+0 === -0 为 true 而 object.is(+0, -0) 为 false。

Object.is 是 JavaScript 中更严格、更符合数学直觉的相等判断方法,它能解决 === 在处理 NaN、+0 和 -0 时的“反直觉”问题。
为什么 === 不够用?
=== 虽然比 == 更可靠,但它有两个公认的例外情况:
-
NaN === NaN返回false(而数学上 NaN 应等于自身) -
+0 === -0返回true(但 IEEE 754 标准中它们是不同值,某些场景需区分)
Object.is 的行为更精确
Object.is(a, b) 按照 SameValue 算法比较,规则简单明确:
- 两个
NaN判定为相等 →Object.is(NaN, NaN) === true -
+0和-0判定为不等 →Object.is(+0, -0) === false - 其余情况与
===行为一致(包括对象引用、原始值等)
什么时候该用 Object.is?
适合对相等性有严格语义要求的场景:
- 实现
Array.prototype.includes的底层逻辑(它内部就用Object.is,所以[NaN].includes(NaN) === true) - 状态对比(如 React 中 shallowEqual 或自定义 hook 的依赖比较)
- 测试断言中需要确认
NaN是否被正确生成或传递 - 需要区分
+0和-0的数值计算或序列化逻辑(比如金融、图形坐标)
使用注意和替代方案
Object.is 是函数调用,不能替代运算符语法;它也不做类型转换,这点和 === 一样。
- 不要写成
a.is(b)—— 它是静态方法:Object.is(a, b) - 深层对象/数组相等仍需额外工具(如
lodash.isEqual),Object.is只做浅层严格比较 - 若只需修复
NaN问题,也可用Number.isNaN(a) && Number.isNaN(b)配合===,但不如Object.is简洁统一











