Object.is用于严格相等判断,比===更精确:NaN===NaN为false,而Object.is(NaN, NaN)为true;+0===-0为true,而Object.is(+0, -0)为false;其余行为与===一致。

Object.is 不是用来比较数据类型的,而是用来做**严格相等判断**的,它比 === 更精确,尤其在处理特殊值(如 NaN、+0 和 -0)时表现更一致。
Object.is 的核心用途:判断两个值是否“完全相同”
它关注的是值本身的同一性,而不是类型本身。不过因为判断过程会自然涉及类型,所以能间接反映类型差异:
- 如果两个值类型不同(比如
5和"5"),Object.is(5, "5")直接返回false—— 这和===一样,不进行类型转换。 - 它对
NaN的处理更合理:Object.is(NaN, NaN)返回true,而NaN === NaN是false。 - 它能区分正零和负零:
Object.is(+0, -0)返回false,而+0 === -0是true。
想比较“数据类型”,应该用 typeof 或 constructor
若你真正想确认两个值是否属于同一数据类型(比如都是 number、都是 object),Object.is 并不适合。推荐方式:
-
typeof a === typeof b:适用于基本类型(string、number、boolean、undefined、function、symbol、bigint),但对null返回"object",且所有对象(包括数组、日期、正则)都返回"object"。 -
Object.prototype.toString.call(a) === Object.prototype.toString.call(b):可精准识别内置类型,例如[object Array]、[object Date]、[object Null]等。 -
a.constructor === b.constructor:适用于自定义对象或有明确构造函数的实例,但不健壮(constructor 可被修改,null/undefined 无 constructor)。
常见误用提醒
不要用 Object.is 来“检查类型”:
立即学习“Java免费学习笔记(深入)”;
-
Object.is([], {})→false(确实不同,但原因不是类型名不匹配,而是两个不同对象) -
Object.is([], [])→false(即使都是数组,也因引用不同而返回 false) -
Object.is(null, undefined)→false(它们类型不同,且Object.is不做任何隐式转换)
什么时候该用 Object.is?
当你需要高保真的相等性判断,尤其在以下场景:
- 实现 Redux 或 Immutable 数据结构中的状态比较
- 写单元测试时断言
NaN是否被正确生成 - 需要区分
+0和-0的数值计算逻辑(如某些数学库或金融精度处理)


















