Object.is()是 JavaScript 中用于比较两个值是否完全相同的方法它的比较规则与严格相等非常相似但在处理NaN和0/-0时有重要区别。1.核心区别对比比较场景(宽松相等)(严格相等)Object.is()类型不同尝试转换后比较直接返回false直接返回falseNaN NaNfalsefalsetrue0 -0truetruefalse普通值可能转换类型类型和值都相同类型和值都相同2.详细区别说明(宽松相等)会进行类型转换后再比较规则复杂容易出错00// true字符串转数字nullundefined// true特殊规则false0// true都转为 0[]false// true数组转数字为 0(严格相等)不进行类型转换类型不同直接返回false但有两个特殊行为NaN NaN返回false0 -0返回true00// false类型不同nullundefined// false类型不同NaNNaN// false特殊规则0-0// true特殊规则Object.is()与基本相同但修正了两个特殊值的行为Object.is(NaN, NaN)返回trueObject.is(0, -0)返回falseObject.is(0,0)// falseObject.is(null,undefined)// falseObject.is(NaN,NaN)// true与 不同Object.is(0,-0)// false与 不同Object.is(hello,hello)// trueObject.is({a:1},{a:1})// false对象引用不同3.为什么需要Object.is()处理NaN的问题在 JavaScript 中NaN是唯一不等于自身的值NaNNaN// false不符合直觉Object.is(NaN,NaN)// true更合理区分0和-0数学上0和-0相等但在某些场景如浮点运算需要区分0-0// trueObject.is(0,-0)// false4.实际应用场景使用Object.is()的场景React 的useMemo、useCallback依赖比较Redux 的不可变数据比较需要精确判断两个值是否完全相同的场景// React 示例constmemoizedValueuseMemo(()computeExpensiveValue(a,b),[a,b]);// React 内部使用 Object.is() 比较依赖项何时使用哪个日常开发优先使用更常见、性能更好需要精确比较特别是处理NaN或0/-0使用Object.is()避免使用除非明确需要类型转换如value null检查null或undefined5.实现原理Object.is()的行为可以用以下逻辑模拟functionis(value1,value2){if(value1value2){// 处理 0 和 -0returnvalue1!0||1/value11/value2;}// 处理 NaNreturnvalue1!value1value2!value2;}总结特性Object.is()类型转换✅❌❌NaN比较falsefalsetrue0vs-0truetruefalse性能中等最快稍慢推荐程度⚠️ 谨慎使用✅ 推荐✅ 特殊场景最佳实践默认使用在需要精确比较NaN或区分0/-0时使用Object.is()。