Javascript передает объекты по ссылке. Это имеет смысл. Но как только вы начинаете манипулировать этими объектами, все действует таким образом, который кажется неинтуитивным. Позвольте мне привести пример:
var a, b;
a = {}
b = a;
a['one'] = {};
console.log( JSON.stringify(a) );
// outputs: {"one":{}}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Это хорошо и хорошо, потому что теперь b
имеет указатель на a
, поэтому ожидается, что присвоение материала a
также повлияет на b
.
Но если я сделаю это:
a = a['one'];
console.log( JSON.stringify(a) );
// outputs: {}
console.log( JSON.stringify(b) );
// outputs: {"one":{}}
Это удивительно для меня. Я бы ожидал, что a
и b
все равно будут одинаковыми (и будут {}
, поскольку a['one']
ранее был установлен на {}
, а a
был установлен на a['one']
).
Но это не так. Похоже, что a
теряет ссылку на b
, когда ему присваивается что-то новое, но b
поддерживает значение, которое a
было установлено до a
, теряя свою ссылку на b
.
Но если я сделаю это:
a['two'] = 2;
console.log( JSON.stringify(a) );
// outputs: {"two":2}
console.log( JSON.stringify(b) );
// outputs: {"one":{"two":2}}
Что? a
явно потерял ссылку на b
, но b
по-прежнему имеет некоторую ссылку на a
.
Указывает ли пустой объект {}
на какое-либо место в памяти, поэтому каждая переменная, ссылающаяся на него, теперь указывает на одно и то же место?
Может ли кто-то с твердым пониманием объяснить это мне?