例如,如果我们复制这样的对象并在复制的对象中修改属性:
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // changed by the "admin" reference
alert(user.name); // 'Pete', changes are seen from the "user" reference
为什么这样做:
let user = { name: 'John' };
let admin = user;
user = null;
console.log(user); // will return null
console.log(admin);// will return {name: "John"}
答案 0 :(得分:2)
通过调用user = null
,您正在破坏现有对象对名为user
的变量的引用,而不是实际的对象。
只要存在对该对象的引用,您就可以使用它。如果没有更多引用,最终将对其进行垃圾回收。
可视化您所做的事情:
user --> { name: 'John' }
user --> { name: 'John' } <-- admin
user --> null
{ name: 'John' } <-- admin
答案 1 :(得分:1)
首先:这不是垃圾回收,但我不会对此进行详细说明,因为这不是您的实际问题。
在内存中,对象{ name: 'John' }
占据的空间仍在存储该空间。
您刚刚将null
分配给了“指向它”的变量之一。
将其想象为指针,就像在c ++中一样:
let user = { name: 'John' };
user ⟶ {name: 'John'}
admin
let admin = user;
user ⟶ {name: 'John'}
↗
admin
user = null;
user {name: 'John'}
↗
admin
因此,“用户”实际上并不是指向任何东西,而是指向“ 空”点,该点基本上表示“ 什么”。
答案 2 :(得分:0)
javascript的工作方式
存在严重误解使用
let admin = user;
您在user
变量中引用 admin
,完全不克隆。