Object.is() 是JavaScript中更精确的严格相等判断方法,+0与-0不相等、NaN与自身相等;其余情况等价于===;仅比较引用,不递归深比较。

Object.is() 是 JavaScript 中用于严格判断两个值是否“相同”的方法,它比 === 更细致,尤其在处理特殊值(如 +0、-0、NaN)时行为更精确。
与 === 的关键区别
虽然 Object.is(a, b) 和 a === b 在绝大多数情况下结果一致,但有两处本质不同:
-
+0和-0:===认为它们相等(+0 === -0返回true),而Object.is(+0, -0)返回false -
NaN:===认为NaN === NaN是false,而Object.is(NaN, NaN)返回true
Object.is 的内部判断逻辑
其算法可简化为以下三步:
- 若两个值都是
NaN,返回true - 若一个是
+0、另一个是-0,返回false - 其余情况等价于
===(即严格相等:类型相同且值相同)
也就是说,它本质上是“带符号零区分 + NaN 自反性”的严格相等。
立即学习“Java免费学习笔记(深入)”;
常见使用场景
适合需要精确语义的场合:
- 实现自定义的
deepEqual或对象 diff 工具时,比较基础值需避免+0/-0被误判为相同 - 状态管理中判断数值是否真正变化(例如
prevCount === 0 && nextCount === 0无法区分是否从-0变成+0) - 测试框架中验证
NaN是否被正确生成或保留(expect(Object.is(result, NaN)).toBe(true))
注意事项
它不进行类型转换,也不处理对象引用以外的深层比较:
- 对对象、数组、函数等引用类型,仍只比较内存地址(和
===一样) - 不会递归比较对象属性,
Object.is({a:1}, {a:1})返回false - 不是用来替代
==或===的通用操作符,而是填补语义空缺的专用工具









