: P Ты погружаешься в мельчайшие мелкие детали, и я рад, что ты спросил, так как ты будешь мудрее к концу.
Не смотрите на это с точки зрения указателей, потому что я думаю, что именно здесь вы запутались. Думайте об этом скорее с точки зрения кучи (или просто «памяти», если хотите) и таблицы символов.
Давайте начнем с первых нескольких строк вашего кода:
var a, b;
a = {}
b = a;
То, что вы здесь сделали, - это создание одного объекта в куче и двух символов в таблице символов. Это выглядит примерно так:
Таблица символов :
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| a | 0x400000 |
+--------+-----------------+
| b | 0x400000 |
+--------+-----------------+
Heap
+----------+-----------------+
| Location | Value |
+----------+-----------------+
| 0x400000 | <object val 1> |
+----------+-----------------+
.
Здесь все становится интереснее: у объектов есть свои собственные "таблицы символов" (обычно это просто хеш-таблицы, но если их назвать таблицей символов, это станет понятнее)
Теперь, после вашего следующего утверждения, вам нужно учесть три вещи: глобальная таблица символов, таблица символов <object val 1>
и куча.
Запустите следующую строку:
a['one'] = {}
А теперь все выглядит так:
Глобальная таблица символов :
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| a | 0x400000 |
+--------+-----------------+
| b | 0x400000 |
+--------+-----------------+
Таблица символов
<object val 1>
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| one | 0x400004 |
+--------+-----------------+
Heap
+----------+-----------------+
| Location | Value |
+----------+-----------------+
| 0x400000 | <object val 1> |
+----------+-----------------+
| 0x400004 | <object val 2> | <---we created a new object on the heap
+----------+-----------------+
.
Теперь вы запустили следующий код:
a = a['one'];
Надеюсь, это должно показаться тривиальным изменением. Результат:
Таблица глобальных символов :
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| a | 0x400004 |
+--------+-----------------+
| b | 0x400000 |
+--------+-----------------+
Таблица символов
<object val 1>
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| one | 0x400004 |
+--------+-----------------+
Heap
+----------+-----------------+
| Location | Value |
+----------+-----------------+
| 0x400000 | <object val 1> |
+----------+-----------------+
| 0x400004 | <object val 2> |
+----------+-----------------+
.
Надеемся, что после размещения памяти в куче должно быть ясно, почему вы получили вывод, который вы сделали.
Теперь все становится еще интереснее, потому что теперь вы делаете:
a['two'] = 2;
Хорошо, давайте рассмотрим шаг за шагом.
a
указывает на область памяти 0x400004
, которая содержит <object val 2>
<object val 2>
- пустой объект, поэтому его таблица символов начинается с пустого
- Запустив эту строку, мы добавим переменную 'two' в таблицу символов
<object val 2>
.
Если вы еще не устали смотреть на эти диаграммы, вы это сделаете. Теперь все выглядит так:
Глобальная таблица символов :
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| a | 0x400004 |
+--------+-----------------+
| b | 0x400000 |
+--------+-----------------+
Таблица символов
<object val 1>
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| one | 0x400004 |
+--------+-----------------+
Таблица символов
<object val 2>
+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
| two | 0x400008 |
+--------+-----------------+
Heap
+----------+-----------------+
| Location | Value |
+----------+-----------------+
| 0x400000 | <object val 1> |
+----------+-----------------+
| 0x400004 | <object val 2> |
+----------+-----------------+
| 0x400008 | 2 (literal val) | <-- yes, even integers are stored on the heap
+----------+-----------------+ in JavaScript.
.
Если вы усердно потратите время, чтобы проследить места памяти, вы увидите, что ваш браузер отобразил правильный вывод.