Object.is 是 JavaScript 中比 === 更精确的严格相等判断方法,能正确处理 NaN、+0 和 -0:NaN 与 NaN 相等,+0 与 -0 不等,对象仍按引用比较。

Object.is 是 JavaScript 中用于判断两个值是否“严格相等”的内置方法,它比 === 更精确,尤其在处理 NaN、+0 和 -0 这些边界情况时表现一致且符合数学直觉。
为什么需要 Object.is?
=== 在比较 NaN 时返回 false(NaN === NaN 为 false),而 Object.is(NaN, NaN) 返回 true;=== 认为 +0 和 -0 相等(+0 === -0 为 true),但 Object.is(+0, -0) 返回 false。这使得 Object.is 更适合需要“完全相同”的场景,比如对象深比较、状态变更检测或 polyfill 实现。
基本用法和语法
调用方式很简单:Object.is(value1, value2),返回布尔值。
- 如果两个值是同一个值(包括引用相同的对象),返回
true - 对于原始值,按“SameValue”算法判定:数值相等且符号相同,
NaN与NaN视为相等 - 对象比较仍看引用,不是内容:只有指向同一内存地址才返回
true
常见对比示例
以下是一些典型对比结果:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
Object.is(0, -0)→false(===返回true) -
Object.is(NaN, NaN)→true(===返回false) -
Object.is(5, 5)→true(和===一致) -
Object.is({}, {})→false(两个不同对象,引用不同) -
const a = {}; Object.is(a, a)→true(同一引用)
实际使用建议
在需要精确相等语义的场合优先考虑 Object.is:
- 实现自定义的
Array.prototype.includes或Set查找逻辑(ES2016+ 已默认使用Object.is) - React 的
useMemo或useCallback依赖数组中做值稳定性判断时,可配合Object.is自定义比较 - 写工具函数如
deepEqual时,基础层用Object.is判断原始值更可靠 - 避免直接替换所有
===—— 大多数业务逻辑无需区分+0/-0,过度使用反而增加理解成本
不复杂但容易忽略细节,用对地方才能发挥它的价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










