首页 > 解决方案 > 谁能解释一下为什么答案是 { name : 'Linda'};

问题描述

let person = { name : 'Linda'};
let members = person;
person = null

console.log(members)

输出是 {name: 'Linda'} 但我了解到的关于引用类型的是成员和人员具有相同的内存地址

标签: javascriptobject

解决方案


...但是我对引用类型的了解是成员和人员具有相同的内存地址...

有点。它们都包含对同一对象的引用,该对象位于内存中的其他位置(不是字面意义上的变量内部)。(无论是字面上的内存地址还是您不需要关心的实现细节,并且可能因 JavaScript 引擎而异。)

当你这样做时person = null,你所做的就是从person变量中清除该引用。这样做members对它所指的对象完全没有影响。

让我们一步一步来:

let person = { name : 'Linda'};

为了处理这个问题,JavaScript 引擎在内存中创建了一个对象。该对象将有某种方式来引用它,称为对象引用。出于我们的目的,假设它是Ref1234(该名称没有潜在含义,我实际上只是随机选择了它,因此我们有一个可以使用的名称):

                        +−−−−−−−−−−−−−−−−−+
Ref1234−−−−−−−−−−−−−−−−>| (对象) |
                        +−−−−−−−−−−−−−−−−−+
                        | 名称:“琳达”|
                        +−−−−−−−−−−−−−−−−−+

然后 JavaScript 引擎将该引用存储在变量中person

                        +−−−−−−−−−−−−−−−−−+
Ref1234−−−−−−−−−−−+−−−−>| (对象) |
                  | +−−−−−−−−−−−−−−−−−+
                  | | 名称:“琳达”|
                  | +−−−−−−−−−−−−−−−−−+
人:Ref1234 -+

然后我们这样做:

let members = person;

这也只是将参考复制personmembers

                        +−−−−−−−−−−−−−−−−−+
Ref1234−−−−−−−−−−−+−+−−>| (对象) |
                  | | +−−−−−−−−−−−−−−−−−+
                  | | | 名称:“琳达”|
                  | | +−−−−−−−−−−−−−−−−−+
人:Ref1234 -+ |
                    |
成员:Ref1234 −−−+

然后我们这样做:

person = null;

所做的一切都null 放入person

                        +−−−−−−−−−−−−−−−−−+
Ref1234−−−−−−−−−−−−−+−−>| (对象) |
                    | +−−−−−−−−−−−−−−−−−+
                    | | 名称:“琳达”|
                    | +−−−−−−−−−−−−−−−−−+
人:空|
                    |
成员:Ref1234 −−−+

这根本不会改变其他任何事情。所以

console.log(members)

显示对象。

如果你这样做了members = null;或者members变量超出了范围而没有闭包保留它等等,并且如果它是唯一包含 Ref1234 的东西,那么 JavaScript 引擎可能会对该对象进行垃圾收集。但是当你这样做时不会发生这种情况,person = null;因为其他东西 ( members) 具有引用的副本。


推荐阅读