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.
Указывает ли пустой объект {} на какое-либо место в памяти, поэтому каждая переменная, ссылающаяся на него, теперь указывает на одно и то же место?
Может ли кто-то с твердым пониманием объяснить это мне?