Допустим есть такой код:
let a = {b: 2, c:3}
let b = {}
b = a
b.b = 3
b.z = 5
console.log(a.b)
console.log(a.z)
Что же будет в a
.b?
Достаточно распространненый вопрос. Прежде всего он направлен на понимание того, что есть объект и на что он ссылается.
Тут основной затык в том, что ты типа не знаешь, что если b=a, то теперь любые изменения внутри b отражаются и на a. Поскольку объекты, это на самом деле ссылки на определенную область в памяти.
Правильный тут ответ будет такой:
console.log(a.b) // 3
console.log(a.z) // 5
Поменяли в b — отразилось в a. Почему? Потому что объект это не просто значение — это ссылка на область в памяти. Соответственно теперь a и b ссылаются на одну и ту же область памяти. И a и b как бы интерфейсы (да, я знаю что это не интерфейсы, мейнфреймы, если вам так будет проще думать об этом обо всем) к этой области памяти. Поэтому и всегда одно и тоже значение у того и другого. Поскольку они смотрят туда же.
Ловушка
Часто еще бывает такой момент, на котором ловятся многие, а именно ссылка на новую область памяти:
let a = {b: 2, c:3}
let b = {}
b = a
b.b = 3
b.z = 5
a = {b: 3}
console.log(a.b) // 3
console.log(a.z) // undefined
Почему так происходит? Все дело вот в этой строчке:
a = {b: 3}
Тут мы по сути дела совмещаем две строки в одну:
a = {}
a.b = 3
Получается что a теперь уже ссылается на другой объект. Или как уже помнится до этого, на область памяти. И соответственно, вот эта вот штука b = a
уже не котируется.
То есть, когда есть вот такое: `a = {}` все предыдущие соглашения отвергаются и создается новое, которое от предыдущего не зависит никак.
let a = {b: 2, c:3}
let b = {}
b = a
b.b = 3
b.z = 5
b = {b: 4}
console.log(a.b) // 3
console.log(a.z) // 5
console.log(b.b) // 4
Такие вот пироги ?