You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改对象属性后两次调用函数返回的对象仍全等?

为什么两次调用f()返回值全等?

核心原因很直接:JavaScript里的对象属于引用类型,===全等运算符在这里比较的不是对象的内容,而是它们指向的内存引用地址。

咱们一步步拆解代码执行的完整过程:

  • 初始状态:g被赋值为0,a是一个空对象,它在内存中占据了一个固定的地址。
  • 第一次调用f():
    • 此时g的值是0,不会进入if分支执行a.h = 2,a还是那个空对象。
    • g自增为1,函数返回a——本质是返回这个对象在内存中的引用地址。
  • 第二次调用f():
    • 此时g的值是1,触发if分支,给a添加属性h=2——注意这是在原来那个对象的内存地址上直接修改内容,完全没有创建新的对象。
    • g自增为2,函数返回a——依然是最初那个对象的内存引用地址。

最后console.log(f() === f())比较的是两次返回的引用地址,因为指向的是同一个对象,哪怕对象的内容被修改了,引用地址始终没变,所以结果就是true。

如果要判断两个对象的内容是否一致,不能直接用===,得手动遍历属性逐一对比,或者用JSON.stringify()(这种方法有局限性,比如无法处理函数、Symbol类型等特殊值)。

内容的提问来源于stack exchange,提问作者Ujjawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:23:16