как работает ссылка в js? [Дубликат]

1

Как узнать js?? : D

    let obj = {}
    let anotherObj = obj 

Теперь anotherObj содержит значение {} качестве ссылки на obj. Таким образом, anotherObj имеет только ссылку на obj. Но когда мы переназначаем новое значение для obj Почему назначение js работает таким образом? И я знаю, что эта функция обеспечивает полезную технику monkeypatching

    anotherObj // {}
    obj = null
    anotherObj // {}

Переменная anotherObj все еще содержит значение {}. Но anotherObj является ссылкой на obj и, насколько я понимаю, он должен содержать null как obj

  • 0
    Посмотрите на ответ на этот вопрос.
Теги:
monkeypatching

1 ответ

1

Вы неправильно понимаете, как работают "ссылки". Вы думаете с точки зрения 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 как вы пытаетесь сделать). Если вы намерены сделать что-то подобное для управления жизненным циклом объекта, то вы будете разочарованы. Вместо этого вам понадобится использовать альтернативный подход, например хранить объект в глобальной переменной, а затем использовать эту глобальную ссылку, а не несколько локальных ссылок.

  • 0
    Спасибо я понял

Ещё вопросы

Сообщество Overcoder
Наверх
Меню