object.is能区分+0和-0且nan与自身相等,而===将+0与-0视为相等且nan!==nan;它基于内部表示(符号位)比较,适用于缓存键、map/set精确比对及单元测试。

Object.is 是 JavaScript 中专门用于严格相等性判断的方法,它能准确区分 +0 和 -0,而普通全等操作符 === 会将二者视为相等。
为什么 === 无法区分 +0 和 -0
JavaScript 的 === 遵循 IEEE 754 标准中的“零值相等”规则:+0 和 -0 在数值意义上被认定为相等。因此:
-
+0 === -0返回 true -
Object.is(+0, -0)返回 false
Object.is 对 +0/-0 的判断逻辑
Object.is 将 +0 和 -0 视为不同值,因为它比较的是**内部表示**(符号位)而非数学值:
-
Object.is(+0, +0)→ true -
Object.is(-0, -0)→ true -
Object.is(+0, -0)→ false -
Object.is(-0, +0)→ false
实际使用场景与建议
当你的逻辑依赖于零的符号(例如缓存键、坐标系统、数值精度处理),需用 Object.is 替代 ===:
- 函数参数或状态值中需要保留 -0 的语义(如表示“向左归零”)
- 实现 Map/Set 键的精确比对(
Map内部使用类似 Object.is 的算法) - 单元测试中验证函数是否正确返回 -0 而非 +0
示例:
const map = new Map();map.set(+0, 'positive zero');
map.set(-0, 'negative zero');
console.log(map.size); // 输出 2 —— 因为 +0 和 -0 被视为不同键
注意 NaN 的特殊行为
Object.is 同时修复了 NaN === NaN 为 false 的问题:
-
NaN === NaN→ false -
Object.is(NaN, NaN)→ true
这使得 Object.is 成为真正符合“值恒等”直觉的判断工具,尤其在涉及边界数值的健壮性校验中更可靠。










