Думайте об этом так. a[0]
не является фактическим объектом {x : 1}
. Этот объект находится где-то в памяти, и a[0]
содержит адрес памяти, где хранится этот объект.
Если вы делаете a[0].x
, вы разыменовываете это. Это означает, что вы анализируете деталь перед .
и видите адрес. Затем вы выбираете объект по этому адресу и проверяете, есть ли у него свойство x
, и возвращаете его.
Но если вы делаете b=a[0]
, вы просто копируете адрес объекта в b. Итак, теперь у вас есть две ссылки (ярлыки на адрес памяти, где хранится объект). Если вы сейчас делаете b.x = 5
, вы смотрите на то, что было до .
; b
содержит адрес объекта, вы извлекаете этот объект из памяти, проверяете, имеет ли он свойство x
и меняете его значение на 5. Но a[0]
указывает на тот же адрес (то есть на тот же объект) если вы попытаетесь сделать a[0].x
, как раньше, вы получите адрес, который вы только что изменили.
Это немного упрощенное объяснение, но вы должны думать о переменных, содержащих объекты, как ярлыки к адресу памяти, где находится реальный объект. И если вы попытаетесь присвоить переменной значение другой объектной переменной, вы просто создадите новый ярлык. Это не верно для переменных, содержащих числа, поэтому x на самом деле содержит значение 1
или 5
, а не адрес. Так что если вы делаете:
y = a[0].x;
y = 10;
a[0].x
не изменит свое значение.