如果通过引用复制对象,为什么JavaScript垃圾收集如此工作?

时间:2019-01-09 14:52:38

标签: javascript object garbage-collection garbage

例如,如果我们复制这样的对象并在复制的对象中修改属性:

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"}

3 个答案:

答案 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,完全不克隆