object.is() 仅比较引用地址,不递归比较对象内容;它修复了===在+0/-0和nan上的缺陷,但对对象、数组等仍等价于===,无法用于内容一致性判断。

Object.is() 不能判定两个对象引用的“完全一致性”,它只做严格相等判断(=== 的增强版),且**对对象类型仍只比较引用地址**,不递归比较属性或结构。
Object.is() 的真实行为
它和 === 几乎一致,但修复了两个边界情况:
-
Object.is(+0, -0)→false(===认为相等) -
Object.is(NaN, NaN)→true(===认为不相等) - 对于普通对象、数组、函数等引用类型,
Object.is(a, b)仅当a和b指向**同一个内存地址**时才返回true,和a === b完全等价。
为什么不能用于“对象内容一致”判断
因为 Object.is() 不深入值内部:
-
Object.is({a:1}, {a:1})→false(两个不同对象) -
const a = {x: 1}; Object.is(a, a)→true(同一引用) -
Object.is([1,2], [1,2])→false(两个独立数组)
若真需判断对象“内容一致”,应选其他方式
根据场景选择合适方案:
-
浅层比较(仅第一层属性):用
JSON.stringify(obj1) === JSON.stringify(obj2)(注意顺序敏感、忽略函数/undefined/symbol、无法处理循环引用) -
可靠浅比较:用 Lodash 的
_.isEqual()或Object.is()配合手动遍历 key(适合已知结构的简单对象) -
深层全等(推荐库):使用
fast-deep-equal、lodash.isequal或deep-equal等成熟工具 - 自定义逻辑:明确哪些字段需比对、是否忽略某些 key、如何处理 Date/RegExp/Map/Set 等特殊类型
小结:Object.is() 的定位很清晰
它是为修复 === 在 NaN 和 ±0 上的反直觉行为而生的底层工具,适用于需要精确原始值语义的场景(如 polyfill、算法边界处理),不是对象内容比对方案。判断两个对象是否“内容一致”,必须脱离引用比较,进入值层面的分析。










