Сегодня я столкнулся с этой проблемой в javascript и не знаю, почему это происходит.
var a = { prop: { bool: true } }; console.log(a.prop.bool); // logs true var b = a; b.prop.bool = false; console.log(a.prop.bool); // logs false ¿?
Вы создали ссылку на тот же объект. Когда вы делаете это, любые изменения переменной b будут влиять на объект, хранящийся в переменной a.
Вам потребуется сделать «клон» объекта, чтобы изменить его, чтобы у вас было два объекта вместо одного с двумя ссылками.
Выражение { prop: ... } Выражение вычисляется один раз для создания одного объекта.
{ prop: ... }
a и b оба являются ссылками на этот отдельный объект.
a
b
См. В чем разница между передачей по ссылке и передачей по значению? и http://en.wikipedia.org/wiki/Reference_(computer_science)
Ссылки широко используются в программировании, особенно для эффективной передачи больших или изменчивых данных в качестве аргументов процедурам или для обмена такими данными среди различных целей.
EDIT
clone из нижнего подчеркивания делает мелкую копию.
clone
Создайте мелко скопированный клон объекта. Любые вложенные объекты или массивы будут скопированы по ссылке, а не скопированы .
Чтобы создать глубокую копию, проще всего, вероятно, сериализовать и десериализовать. Это будет делать странные вещи, если a имеет контрольные циклы.
var b = JSON.parse(JSON.stringify(a));
когда вы присваиваете b назначению a, это по ссылке, что означает, что b ссылается на то же место в памяти, что и при обновлении b, когда вы наблюдаете a, похоже, что a также обновляется.