ли objectA.pointer
ссылка или objectB.pointer
ссылка все еще существует даже objectA
и objectB
устанавливаются null
?
Да.
Возможно, какое-то искусство ASCII помогает. После выполнения
var objectA = {};
var objectB = {};
среда содержит две переменные (objectA
и objectA
), которые держат ссылки на два объекта (обозначенный как ref:XXX
):
+--------------+
+-------+---------+ +--->| Object#123 |
|objectA|ref:123 *+--+ +--------------+
+-------+---------+
|objectB|ref:456 *+--+ +--------------+
+-------+---------+ +--->| Object#456 |
+--------------+
После добавления свойств к Objets,
objectA.pointer = objectB;
objectB.pointer = objectA;
оба объекта имеют свойство pointer
, каждая из которых содержит ссылку на другой объект:
+-----------------+
| Object#123 |
+--->+-------+---------+<----+
+-------+---------+ | |pointer|ref:456 *+---+ |
|objectA|ref:123 *+-+ +-------+---------+ | |
+-------+---------+ | |
|objectB|ref:456 *+-+ +-----------------+ | |
+-------+---------+ | | Object#456 | | |
+--->+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
Как вы можете себе увидеть, что нет никакой связи между pointer
собственности и objectA
и objectB
переменных. objectA.pointer
не относится к переменной objectB
, он получил копию своего значения (ref:456
), ссылку на объект.
После установки обеих переменных null
,
objectA = null;
objectB = null;
среда выглядит следующим образом:
+-----------------+
| Object#123 |
+-------+---------+<----+
+-------+---------+ |pointer|ref:456 *+---+ |
|objectA| null | +-------+---------+ | |
+-------+---------+ | |
|objectB| null | +-----------------+ | |
+-------+---------+ | Object#456 | | |
+-------+---------+<--+ |
|pointer|ref:123 *+-----+
+-------+---------+
В pointer
свойства до сих пор держат ссылки на другой объект. Замена значений objectA
и objectB
не изменила этого.
'objectA = null;' только устанавливает значение переменной * 'objectA' в' null'. Он не изменяет значение свойства * 'objectB.pointer'. 'objectB.pointer' по-прежнему относится к объекту. Переменные/свойства - это просто контейнеры для значений.Назначения «копируют» значение, а теперь два контейнера содержат «одинаковое» значение (каждый из них имеет свою собственную копию). Замена значения в одном из контейнеров не волшебным образом заменяет значение в другом контейнере. –
Настройка 'objectA' на' null' не изменяет 'objectB.pointer' – vlaz
@FelixKling: Как ** objectB.pointer ** ссылается на объект, если для объекта B установлено значение null? –