为何修改对象属性后两次调用函数返回的对象仍全等?
为什么两次调用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
相关产品推荐
相关产品推荐

