конфликт значений свойства объекта javascript - PullRequest
1 голос
/ 15 июля 2010

Я не очень уверен насчет названия вопроса, здесь ситуация, пожалуйста, посмотрите следующий пример кода

// original data
a = [
  {x : 1},
  {x : 2},
  {x : 3}
]

// assign to a variable  
b = a[0]

// do some change
b.x = 5

alert(a[0].x) 
// i thought it would still be 1 but it is 5, why???

* editспасибо Амбер и Андрейя думаю, что я просто напишу функцию, чтобы перебрать свойства объекта, чтобы скопировать в новый объектеще раз спасибо за помощь :)

Ответы [ 2 ]

1 голос
/ 15 июля 2010

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

b просто хранит ссылку на тот же объект, которыйa[0] хранит ссылку на.

0 голосов
/ 15 июля 2010

Думайте об этом так. 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 не изменит свое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...