Почему это происходит в JavaScript? - PullRequest
3 голосов
/ 07 октября 2011

Сегодня я столкнулся с этой проблемой в 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 ¿?

Ответы [ 3 ]

5 голосов
/ 07 октября 2011

Вы создали ссылку на тот же объект. Когда вы делаете это, любые изменения переменной b будут влиять на объект, хранящийся в переменной a.

Вам потребуется сделать «клон» объекта, чтобы изменить его, чтобы у вас было два объекта вместо одного с двумя ссылками.

5 голосов
/ 07 октября 2011

Выражение { prop: ... } Выражение вычисляется один раз для создания одного объекта.

a и b оба являются ссылками на этот отдельный объект.

См. В чем разница между передачей по ссылке и передачей по значению? и http://en.wikipedia.org/wiki/Reference_(computer_science)

Ссылки широко используются в программировании, особенно для эффективной передачи больших или изменчивых данных в качестве аргументов процедурам или для обмена такими данными среди различных целей.

EDIT

clone из нижнего подчеркивания делает мелкую копию.

Создайте мелко скопированный клон объекта. Любые вложенные объекты или массивы будут скопированы по ссылке, а не скопированы .

Чтобы создать глубокую копию, проще всего, вероятно, сериализовать и десериализовать. Это будет делать странные вещи, если a имеет контрольные циклы.

var b = JSON.parse(JSON.stringify(a));
3 голосов
/ 07 октября 2011

когда вы присваиваете b назначению a, это по ссылке, что означает, что b ссылается на то же место в памяти, что и при обновлении b, когда вы наблюдаете a, похоже, что a также обновляется.

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