以下是 Object.is()
原理的总结,涵盖其核心机制、比较规则以及与内存引用地址的关系:
Object.is()
原理总结
定义
Object.is(value1, value2)
是 JavaScript ES6 引入的静态方法,用于比较两个值是否“相同”,基于 SameValue 算法 返回布尔值。它旨在提供比 ===
更精确的相等性判断,尤其在处理特殊值时。
核心机制
- SameValue 算法:
Object.is()
的比较逻辑遵循此算法,综合考虑值的类型、内容和引用,而不是单纯依赖内存地址。 - 与
===
的区别:- 处理
NaN
:Object.is(NaN, NaN)
返回true
,而NaN === NaN
是false
。 - 处理
0
和-0
:Object.is(0, -0)
返回false
,而0 === -0
是true
。 - 其他情况与
===
一致。
- 处理
比较规则
- 基本类型(Primitives):
- 类型不同:返回
false
。 - 数字:
- 两个
NaN
:返回true
(逻辑相等,不依赖内存地址)。 +0
和-0
:返回false
(区分正负零)。- 其他数字:值相等返回
true
。
- 两个
- 字符串、布尔值、null、undefined:值和类型完全相等返回
true
。
- 类型不同:返回
- 对象类型(Objects):
- 比较的是 内存引用地址,只有指向同一对象(引用完全相同)时返回
true
。 - 内容相同但引用不同的对象返回
false
。
- 比较的是 内存引用地址,只有指向同一对象(引用完全相同)时返回
是否只依赖内存引用地址?
- 对象:是的,只有内存引用地址完全一样(即同一对象实例),
Object.is()
才会返回true
。 - 基本类型:不完全依赖内存地址,而是基于值的逻辑相等性:
NaN
被视为相同,尽管没有固定内存表示。+0
和-0
被视为不同,尽管内存位模式可能一致(取决于实现)。- 其他基本类型的值相等性与内存无关。
示例
// 基本类型
Object.is(5, 5); // true,值相等
Object.is(NaN, NaN); // true,逻辑相同
Object.is(0, -0); // false,区分正负零
// 对象
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
Object.is(obj1, obj2); // false,引用不同
Object.is(obj1, obj3); // true,引用相同
在 React 中的应用
- React 的
useEffect
使用Object.is()
比较依赖项:- 对象依赖:仅引用相同视为“未变化”。
- 基本类型依赖:遵循 SameValue 算法(如
NaN
不触发重复运行,+0
到-0
会触发)。
总结
Object.is()
的本质:基于 SameValue 算法,提供精确的相等性比较。- 内存引用地址:对对象是决定性因素(必须完全一样),对基本类型则不完全依赖,而是看逻辑相等性。
- 特殊性:处理
NaN
和+/-0
的独特规则使其区别于===
,更适合某些场景(如 React 依赖项比较)。
这个总结涵盖了 Object.is()
的原理和关键点,简洁明了又不失深度。如果你需要更详细的代码实现或某个部分的扩展,随时告诉我!
前端工程师、程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现