Почему сборка мусора в JavaScript работает так, если объекты копируются по ссылке? - PullRequest
0 голосов
/ 09 января 2019

Если, например, мы скопируем подобный объект и изменим свойство в нашем скопированном объекте:

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 голосов
/ 09 января 2019

Существует серьезное недопонимание , как работает javascript

с

let admin = user;

вы ссылаетесь user в admin var, не клонируете это вообще.

0 голосов
/ 09 января 2019

Прежде всего: это не сборка мусора, но я не буду на этом останавливаться, поскольку это не ваш настоящий вопрос.

В памяти пространство, занимаемое объектом { 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 

И, следовательно, «пользователь» на самом деле не указывает ни на что, он указывает на точку « null », которая в основном означает « ничто ».

0 голосов
/ 09 января 2019

Вызывая user = null, вы уничтожаете ссылку, которую существующий Объект имел на переменную с именем user, а не на реальный Объект.

Вы сможете использовать Объект, если на него есть какая-либо ссылка. Когда ссылок больше не будет, это будет мусор со временем.

Визуализация того, что вы сделали:

user --> { name: 'John' }

user --> { name: 'John' } <-- admin

user --> null
         { name: 'John' } <-- admin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...