object.is是es6引入的精确值比较方法,采用samevalue算法解决===在nan和+0/-0上的缺陷:nan与nan相等、+0与-0不等,其余行为与===一致,适用于deepequal、状态检测等需严格相等的场景。

Object.is 是 ES6 引入的精确值比较方法,它用 SameValue 算法 判断两个值是否“完全相同”,解决了 === 在 NaN 和 +0 / -0 上的语义缺陷。
它比 === 更准确的两个关键点
— NaN 与 NaN 相等:Object.is(NaN, NaN) 返回 true,而 NaN === NaN 是 false
— +0 与 -0 不相等:Object.is(+0, -0) 返回 false,而 +0 === -0 是 true
基础行为和 === 一致的部分
- 不进行类型转换:
Object.is(1, '1')→false(和 === 一样) - 原始值按值比较:
Object.is('abc', 'abc')、Object.is(true, true)都返回true - 对象仍按引用比较:
Object.is({}, {})→false;只有同一对象实例才返回true - null、undefined、同值布尔/字符串/数字都按预期返回
true
什么时候该用 Object.is 而不是 ===
- 实现 deepEqual 工具函数时,原始值层用 Object.is 更可靠
- 状态变更检测(如 React 的自定义 hook 依赖判断)需要区分
-0和+0时 - 构建不可变数据结构或 Set/Map 的键比较逻辑(ES2016+ 中 Set.prototype.has 默认就用 Object.is)
- polyfill 或规范对齐场景,比如模拟 SameValueZero 以外的语义
不建议滥用的情况
- 日常业务中判断数字是否为 0 —— 大多数场景无需区分 +0/-0
- 替换所有 === —— 增加认知负担,且无实际收益
- 仅做简单相等检查(如表单校验、ID 匹配)—— === 完全够用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











