joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

以下是 Object.is() 原理的总结,涵盖其核心机制、比较规则以及与内存引用地址的关系:


Object.is() 原理总结

定义

Object.is(value1, value2) 是 JavaScript ES6 引入的静态方法,用于比较两个值是否“相同”,基于 SameValue 算法 返回布尔值。它旨在提供比 === 更精确的相等性判断,尤其在处理特殊值时。

核心机制

  • SameValue 算法Object.is() 的比较逻辑遵循此算法,综合考虑值的类型、内容和引用,而不是单纯依赖内存地址。
  • === 的区别
    • 处理 NaNObject.is(NaN, NaN) 返回 true,而 NaN === NaNfalse
    • 处理 0-0Object.is(0, -0) 返回 false,而 0 === -0true
    • 其他情况与 === 一致。

比较规则

  1. 基本类型(Primitives)
    • 类型不同:返回 false
    • 数字
      • 两个 NaN:返回 true(逻辑相等,不依赖内存地址)。
      • +0-0:返回 false(区分正负零)。
      • 其他数字:值相等返回 true
    • 字符串、布尔值、null、undefined:值和类型完全相等返回 true
  2. 对象类型(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() 的原理和关键点,简洁明了又不失深度。如果你需要更详细的代码实现或某个部分的扩展,随时告诉我!

posted on   joken1310  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示