Как работает литеральное назначение и ссылка объекта Javascript?

У меня простой вопрос

let obj1 = {};
obj2= obj1;`

Здесь obj1 и obj2 ссылаются на один и тот же объект в памяти, то есть obj1===obj2 --> true. Таким образом, по этой логике любая операция над obj2 повлияет на obj1.

Теперь, если я назначу свойство obj2

let obj1 = {};
obj2 = obj1;

obj2['a'] = {};
obj2 = obj2['a']; // why this operation didn't change obj1, if they are referencing the same object ?
console.info(obj1); // -- > { a: {} };
console.info(obj2); // -- > {};

теперь obj1===obj2 --> false почему это ?

Также как получилось obj2 = {} is different then obj2 = obj2['a'] ?

Скриншот для пояснения себя

Заранее благодарны за Вашу помощь.

obj2 = obj2.a переназначает obj2, чтобы он больше не указывал на obj1.
Aplet123 22.12.2020 02:55

Потому что, когда вы делаете obj2 = obj2[a], вы переназначаете имя идентификатора obj2 на совершенно новое значение, а не просто добавляете свойство.

Andrew Li 22.12.2020 02:56

для объекта.. равенство определяет, на что он указывает.. на другие вещи, такие как строки или числа.. это просто значения

The Bomb Squad 22.12.2020 02:58

Спасибо @Aplet123 Это тот случай, когда obj2 = {}. Однако, если мы делаем obj2['b'] = {}; obj2 = obj2['b']; , это также изменяет obj1 на {'a':{'b':{}}}. Эта часть меня смущает.

niraj 22.12.2020 03:01
obj2.b = {} не переназначает obj2, он присваивает значение свойству obj2, то есть оно по-прежнему указывает на obj1, то есть изменения будут отражены в obj1. obj2 = obj2.b не имеет значения.
Aplet123 22.12.2020 03:05

@niraj Почему тебя это смущает? После obj2.a = {}; obj2 = obj2.a;obj1 указывает на тот же объект, что и раньше. obj2 нет; он указывает на свойство a объекта, на который указывает obj1. obj1 === obj2.a. Затем, если вы добавите свойство b к obj2, вы просто вложите другое свойство в obj2. Поскольку obj1 по-прежнему указывает на «корневой» объект, естественно, он отражает все изменения.

Sebastian Simon 22.12.2020 03:08

@niraj Прохождение этой визуализации также может помочь прояснить некоторые вещи

Nick Parsons 22.12.2020 03:09

Вы путаете назначение переменной с назначением свойства объекта.

StackSlave 22.12.2020 03:15

@NickParsons Это очень полезно. Большое спасибо!!

niraj 22.12.2020 03:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

obj2 — это объект, obj2[a] — другой объект. Результат сравнения двух объектов ложный.

 {} === {}    // false
Ответ принят как подходящий

Для объектов оператор присваивания = присваивает ссылку на объект.

Итак, в:

let obj1 = {};
let obj2 = obj1;

оба obj1 и obj2 ссылаются на один и тот же объект. Сейчас:

obj2['a'] = {};

создает новое свойство a и присваивает ему значение, являющееся ссылкой на новый объект. Поскольку и obj1, и obj2 ссылаются на один и тот же объект, вы также найдете:

obj2.a === obj1.a

Но потом:

obj2 = obj2['a']; // why this operation didn't change obj1, if they are referencing the same object ?

Теперь вы присвоили obj2 другой объект, поэтому теперь он ссылается на новый объект, изначально назначенный obj2.a, и:

obj1.a === obj2;

Таким образом, obj1 был изменен (или, точнее, объект, на который ссылается obj1, был изменен).

Некоторый код:

// obj1 and obj2 reference the same object
let obj1 = {};
let obj2 = obj1;
console.info('obj2 === obj1     ' + (obj2 === obj1)); // true

// Assign new object to obj2.a
obj2['a'] = {};

// Affects obj1
console.info('obj2.a === obj1.a ' + (obj2.a === obj1.a)); // true

// Assign new object to obj2
obj2 = obj2['a'];

// obj2 now references a different object to obj1
console.info('obj1 === obj2     ' + (obj1 === obj2)); // false

// obj1.a still references new object
console.info('obj1.a === obj2   ' + (obj1.a === obj2)); // true

Другие вопросы по теме