object.is() 为弥补 === 在 nan 和 ±0 上的不足而设计:nan === nan 为 false 而 object.is(nan, nan) 为 true;+0 === -0 为 true 而 object.is(+0, -0) 为 false;其余情况两者行为一致。

全等运算符(===)本身**不处理** Object.is() 的特殊边界情况——它压根就不按那些规则来。准确说,Object.is() 是为弥补 === 在两个关键点上的“不足”而设计的:一是 NaN === NaN 返回 false,二是 +0 === -0 返回 true。
NaN 的比较行为不同
=== 把 NaN 视为永远不等于任何值,包括它自己:
-
NaN === NaN→ false -
Object.is(NaN, NaN)→ true
这是最常踩坑的地方。比如你在写防抖逻辑或状态缓存时,若用 === 判断是否“值未变”,遇到 NaN 就会误判为变化了。
+0 和 -0 被视为相同
=== 认为正零和负零在数值上完全等价:
-
+0 === -0→ true -
Object.is(+0, -0)→ false
虽然日常开发中极少显式使用 -0,但在涉及数学计算、浮点精度控制、或底层数据序列化(如 WebAssembly、二进制协议)时,区分符号零是有实际意义的。
其他情况两者表现一致
对于所有其余值,Object.is(a, b) 和 a === b 的结果完全相同:
- 基本类型(字符串、布尔、
null、undefined、BigInt、Symbol)逐值比较 - 引用类型(对象、数组、函数)只在指向同一内存地址时返回
true - 不进行任何类型转换,也不调用
valueOf()或toString()
也就是说,Object.is 不是“升级版 ===”,而是“更数学意义上严格”的相等判断——它遵循 IEEE 754 标准对 NaN 和带符号零的定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











