Object.is判定两个值是否“严格相同”,修正===在+0与-0、NaN与NaN上的缺陷,其余情况与===一致;不进行对象深度比较,仅比较引用或原始值。

Object.is 并不判定“对象相等”,它判定的是两个值是否“严格相同”(same value),属于值比较,不是对象结构或属性的深度比对。它的底层逻辑非常直接,是 ECMAScript 规范明确定义的抽象算法,不涉及遍历、递归或反射。
核心行为:处理特殊值的精确区分
Object.is 的关键在于修正 === 在三个边界情况下的行为:
-
+0 与 -0 被视为不同:
Object.is(+0, -0) === false,而+0 === -0是true -
NaN 等于 NaN:
Object.is(NaN, NaN) === true,而NaN === NaN是false -
其他所有情况与 === 一致:如
Object.is(1, 1)、Object.is('a', 'a')、Object.is({}, {})(后者为false,因引用不同)都和===结果相同
实际实现逻辑(伪代码级)
规范中定义的算法可简化为:
- 若二者为同一值(SameValueZero 不适用,SameValue 才用此规则),且都不是
NaN,则检查是否都是+0或都是-0;若一个是+0、另一个是-0,返回false - 若二者都是
NaN,返回true - 否则,直接使用
===判断
现代引擎(如 V8)通常将 Object.is 编译为极简的汇编指令序列,例如先做位级比较,再针对浮点寄存器的符号位单独判断 0,无函数调用开销。
立即学习“Java免费学习笔记(深入)”;
常见误解澄清
Object.is 不比较对象内容 —— Object.is({a:1}, {a:1}) 返回 false,因为它只比内存地址(引用);同样,Object.is([1], [1]) 也是 false。需要结构相等请用 deepEqual 类库或手动递归实现。
它也不是为了替代 === 而设计,而是为 Map 键去重、Object.freeze 状态检测、以及实现 SameValue 语义(如 Array.prototype.includes 内部就用它判断 NaN)等特定场景服务。


















