Рубрики
programming

Ссылки на объекты в памяти

Допустим есть такой код:

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

Такие вот пироги 🥮