object.is 用于判断两个值是否严格相等(samevalue算法),不涉及原型比较;它能区分+0与-0、nan与nan,但无法判断对象原型是否相同,原型比较应使用object.getprototypeof()配合===。

Object.is 不能用来比较“原型对象是否绝对相等”,它比较的是两个值是否严格相等(即“SameValue”算法),和原型链、constructor 或 __proto__ 无关。
Object.is 的作用是值比较,不是原型比较
Object.is(a, b) 判断的是 a 和 b 是否满足 SameValue 相等性,它比 === 更严格(例如能区分 +0 和 -0,且 NaN === NaN 为 false,但 Object.is(NaN, NaN) 为 true)。但它不检查对象的原型、属性或继承关系。
- 对普通对象,
Object.is({},{})总是false—— 因为它们是两个不同引用的空对象; - 对函数或构造函数,
Object.is(Array, Array)是true(同一引用),但Object.is(Array, Object)是false; - 它不会深入比较
obj1.__proto__和obj2.__proto__是否相同。
想比较两个对象的原型是否相同,该用 Object.getPrototypeOf()
要判断两个对象是否“共享同一个原型”,应获取它们的原型再比较:
-
Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2)—— 这才是检查原型是否为同一对象引用; - 如果想确认某个对象的原型是否等于特定构造函数的
prototype,比如:Object.getPrototypeOf(arr) === Array.prototype; - 注意:不要用
obj.constructor.prototype,因为constructor可能被修改,不可靠。
常见误区:混淆“原型相等”和“实例相等”
举例说明:
const a = {};
const b = {};
const c = Object.create(a.__proto__); // c 的原型和 a 相同
Object.is(a, b); // false —— 不同对象
Object.is(Object.getPrototypeOf(a), Object.getPrototypeOf(b)); // true —— 都是 Object.prototype
Object.is(Object.getPrototypeOf(c), Object.getPrototypeOf(a)); // true —— 同一原型对象
这里真正起作用的是 ===(或 Object.is)对原型对象的引用比较,而不是对原始对象本身的比较。
总结:Object.is 不负责原型逻辑,只是值的精确判等
如果你的目标是“判断两个对象是否继承自同一个原型”,就用 Object.getPrototypeOf(x) === Object.getPrototypeOf(y);
如果目标是“判断两个值是否在 SameValue 意义下相等”,才用 Object.is(x, y)。
两者目的不同,不能混用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











