javascript - 谁能解释一下为什么答案是 { name : 'Linda'};
问题描述
let person = { name : 'Linda'};
let members = person;
person = null
console.log(members)
输出是 {name: 'Linda'} 但我了解到的关于引用类型的是成员和人员具有相同的内存地址
解决方案
...但是我对引用类型的了解是成员和人员具有相同的内存地址...
有点。它们都包含对同一对象的引用,该对象位于内存中的其他位置(不是字面意义上的变量内部)。(无论是字面上的内存地址还是您不需要关心的实现细节,并且可能因 JavaScript 引擎而异。)
当你这样做时person = null
,你所做的就是从person
变量中清除该引用。这样做members
对它所指的对象完全没有影响。
让我们一步一步来:
let person = { name : 'Linda'};
为了处理这个问题,JavaScript 引擎在内存中创建了一个对象。该对象将有某种方式来引用它,称为对象引用。出于我们的目的,假设它是Ref1234
(该名称没有潜在含义,我实际上只是随机选择了它,因此我们有一个可以使用的名称):
+−−−−−−−−−−−−−−−−−+ Ref1234−−−−−−−−−−−−−−−−>| (对象) | +−−−−−−−−−−−−−−−−−+ | 名称:“琳达”| +−−−−−−−−−−−−−−−−−+
然后 JavaScript 引擎将该引用存储在变量中person
:
+−−−−−−−−−−−−−−−−−+ Ref1234−−−−−−−−−−−+−−−−>| (对象) | | +−−−−−−−−−−−−−−−−−+ | | 名称:“琳达”| | +−−−−−−−−−−−−−−−−−+ 人:Ref1234 -+
然后我们这样做:
let members = person;
这也只是将参考复制person
到members
:
+−−−−−−−−−−−−−−−−−+ Ref1234−−−−−−−−−−−+−+−−>| (对象) | | | +−−−−−−−−−−−−−−−−−+ | | | 名称:“琳达”| | | +−−−−−−−−−−−−−−−−−+ 人:Ref1234 -+ | | 成员:Ref1234 −−−+
然后我们这样做:
person = null;
所做的一切都null
放入person
:
+−−−−−−−−−−−−−−−−−+ Ref1234−−−−−−−−−−−−−+−−>| (对象) | | +−−−−−−−−−−−−−−−−−+ | | 名称:“琳达”| | +−−−−−−−−−−−−−−−−−+ 人:空| | 成员:Ref1234 −−−+
这根本不会改变其他任何事情。所以
console.log(members)
显示对象。
如果你这样做了members = null;
或者members
变量超出了范围而没有闭包保留它等等,并且如果它是唯一包含 Ref1234 的东西,那么 JavaScript 引擎可能会对该对象进行垃圾收集。但是当你这样做时不会发生这种情况,person = null;
因为其他东西 ( members
) 具有引用的副本。
推荐阅读
- vba - Excel VBA 将参数传递给 OLEDBConnection
- r - R - 用两个表格计算百分比
- c++ - uint32_t 指针指向与 uint8_t 指针相同的位置
- azure - 自动缩放在 Azure Kubernetes 服务 (AKS) 中不起作用
- c# - 当我使用 HttpWebRequest C# 重定向到 url 时收到错误请求 (400)
- git - 为什么我收到“错误未能推送一些参考”?
- javascript - 重构异步道具更新
- google-analytics - Google IP 匿名化会丢失什么?
- python - python apache phoenix jdbc 连接
- sql-server - SQL Server 2016 外部数据源 - “外部”附近的语法不正确