Всем доброго времени суток!
В процессе изучения js возник вопрос по теме хранения и передачи значений в переменных. Насколько я понял, js хранит в переменной указатель на память, в которой сидит само значение. То есть если взять объект, создать другую переменную, присвоить новой переменной значение переменной изначального объекта - это будут просто две ссылки на один и тот же объект. Я проверил изменить какое-нибудь свойство объекта - действительно меняется объект по обоим переменным. Но если я возьму, и просто присвою одной из переменных любое какое-нибудь значение, например, числовое 5, то по второй переменной останется тот же объект. И теперь вопрос: почему так? Мы ведь изменили содержание ячейки переменной, на которую ссылается вторая переменная тоже. Но, судя по всему, работает это как-то по другому...
Ну есть у тебя объект:
let obj = {}
Ты создаешь еще одну переменную и копируешь туда значение из первой переменной:
let obj2 = obj
Что в итоге имеется?
Две переменные, которые хранят АДРЕС ячейки памяти, где в свою очередь хранится сам объект
Предположим, для примера, что 0xc000018050 это адрес (в шестнадцатеричной системе счисления), по которому хранится объект, то есть в переменных obj и obj2 записано 0xc000018050
Грубо говоря:
let obj = {} // 0xc000018050
let obj2 = obj // 0xc000018050
При обращении к свойству объекта мы косвенно обращаемся к ячейке памяти по адресу 0xc000018050, и если перезаписать свойство, то изменения, само собой, будут видны и для obj2, так как это ссылка на ту же самую область памяти
А если ты присвоишь какое-то новое значение САМОЙ переменной, скажем obj, то есть сделаешь так:
obj = 5
То этом случае ты просто перезатрешь хранящееся там значение, а именно ССЫЛКУ, САМУ ССЫЛКУ на область памяти, в которой хранится объект. С самим объектом ты не сделаешь ровным счетом ничего. В итоге ситуация будет следующей:
let obj = {} // 0xc000018050
let obj2 = obj // 0xc000018050
obj = 5 // теперь в переменной obj хранится не 0xc000018050, а просто значение 5
obj2 // по-прежнему хранит ссылку 0xc000018050