... as Обе переменные (a и a2) указывают на один и тот же объект ...
Они больше не, с этой строки:
a={};
В этот момент a2
относится к старому объекту, а a
относится к новому, другому объекту.
a2 = a
не создает никакой непрерывной связи между переменной a2
и переменной a
.
Давайте добавим немного юникод-арта:
После запуска этого кода:
var a = {
prop1: "a",
prop2: "b",
fun: function() {
return this.prop1 + " " + this.prop2;
}
}
var a2 = a;
a.fn = "v";
На данный момент, у вас есть что-то подобное в памяти (с опущенными различными деталями):
a:Ref44512−−−+
|
|
| +−−−−−−−−−−−−−+
+−−−>| (object) |
| +−−−−−−−−−−−−−+
| | prop1: "a" |
| | prop2: "b" | +−−−−−−−−−−−−+
a2:Ref44512−−+ | fun:Ref7846 |−−>| (function) |
| vn: "v" | +−−−−−−−−−−−−+
+−−−−−−−−−−−−−+
Эти значения "Ref" являются ссылками на объекты. (На самом деле мы никогда не видим их значений, эти значения просто выдуманы.) Обратите внимание, что значение в a
и значение в a2
, однако, одинаковы.
Если в этот момент вы сделаете a === a2
, это будет true
: обе переменные ссылаются на один и тот же объект.
Но когда вы сделаете это:
a={};
+−−−−−−−−−−−−−+
a:Ref84521−−−−−−−>| (object) |
+−−−−−−−−−−−−−+
+−−−−−−−−−−−−−+
a2:Ref44512−−−−−−>| (object) |
+−−−−−−−−−−−−−+
| prop1: "a" |
| prop2: "b" | +−−−−−−−−−−−−+
| fun:Ref7846 |−−>| (function) |
| vn: "v" | +−−−−−−−−−−−−+
+−−−−−−−−−−−−−+
На данный момент a === a2
равно false
: переменные ссылаются на разные объекты.