Как узнать js?? : D
let obj = {}
let anotherObj = obj
Теперь anotherObj
содержит значение {}
качестве ссылки на obj
. Таким образом, anotherObj
имеет только ссылку на obj
. Но когда мы переназначаем новое значение для obj
Почему назначение js работает таким образом? И я знаю, что эта функция обеспечивает полезную технику monkeypatching
anotherObj // {}
obj = null
anotherObj // {}
Переменная anotherObj
все еще содержит значение {}
. Но anotherObj
является ссылкой на obj
и, насколько я понимаю, он должен содержать null
как obj
Вы неправильно понимаете, как работают "ссылки". Вы думаете с точки зрения pointers
как на C. Когда вы видите...
var obj = {};
var anotherObj = obj;
... вы думаете, что obj
ссылается на объект и anotherObj
ссылки anotherObj
obj
который ссылается на объект. Вы думаете о цепочке ссылок. Но это не так, как присваивание работает на большинстве языков, если вы не используете pointers
или другие ссылки адресного пространства.
Вместо этого происходит var obj = {};
создает объект в некоторой ячейке памяти, а obj
теперь содержит эту ячейку памяти. Когда вы делаете var anotherObj = obj;
, тогда obj
оценивается как это место памяти, и теперь это место памяти назначается как значение anotherObj
. Итак, теперь, а не anotherObj
указывающий на obj
, мы имеем оба obj
и anotherObj
указывающие на то же расположение памяти obj.
Итак, когда мы делаем obj = null
, мы изменяем значение, которое obj
указывает to-- anotherObj
, все еще указывая на расположение памяти созданного объекта.
Насколько мне известно, нет способа обновить все ссылки на объекты или даже удалить объект вручную (например, заменить его null
как вы пытаетесь сделать). Если вы намерены сделать что-то подобное для управления жизненным циклом объекта, то вы будете разочарованы. Вместо этого вам понадобится использовать альтернативный подход, например хранить объект в глобальной переменной, а затем использовать эту глобальную ссылку, а не несколько локальных ссылок.