62
задан 19 April 2013 в 09:08

5 ответов

Следование Вашему примеру линию за линией:

a = {}

a теперь ссылается на новый объект.

b = a;

b теперь ссылается на тот же объект это a ссылки. Обратите внимание, что это не ссылается a.

a['one'] = {};

новый объект теперь имеет индекс 'one' что ссылки другой новый объект.

, Когда Вы делаете

a = a['one'];

, Вы - установка a для обращения к [1 113], который является, что новый объект, который Вы создали, когда Вы сделали a['one'] = {}. b все еще ссылается на объект, который Вы создали с [1 116].

Вы путаете проблему, когда Вы говорите" a, потерял ее ссылку на [1 118]", потому что a не относится к [1 120], ни наоборот. a и b относятся к [1 126] объекты , и они могут быть заставлены обратиться к другим объектам. Как это:

С [1 123], Вы добираетесь

a
 \
  \
   { }
  /
 /
b

Затем с [1 124], Вы добираетесь

a
 \
  \
   { one: { } }
  /
 /
b

Затем с [1 125], Вы добираетесь

a - - - - 
          \
   { one: { } }
  /
 /
b
203
ответ дан 31 October 2019 в 13:03

:P Вы убываете в knitty песчаные детали, и я рад, что Вы спросили, поскольку Вы будете более мудрыми к концу.

не смотрят на него с точки зрения указателей, потому что я думаю, что это - то, где Вы запутываетесь. Думайте о нем скорее с точки зрения "кучи" (или просто "память", если Вы будете), и таблица символов.

Позволяет, запускаются путем провожения первых нескольких строк кода:

var a, b;

a = {}
b = a;

то, Что Вы сделали здесь, создается один объект на "куче" и два символа на таблице символов. Это выглядит примерно так:

<час>

Таблица символов :

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|      a |        0x400000 |
+--------+-----------------+
|      b |        0x400000 |
+--------+-----------------+

"куча" :

+----------+-----------------+
| Location | Value           |
+----------+-----------------+
| 0x400000 | <object val 1>  |
+----------+-----------------+

.

<час>

Вот то, где вещи становятся интересными: Объекты имеют свои собственные "таблицы символов" (обычно, это просто хеш-таблицы, но вызов его таблица символов может сделать его более ясным).

Теперь, после Вашего следующего оператора, у Вас есть 3 вещи рассмотреть: глобальная таблица символов, <object val 1> таблица символов и "куча".

Выполнение следующая строка:

a['one'] = {}

И теперь вещи похожи на это:

<час>

Глобальная Таблица символов :

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|      a |        0x400000 |
+--------+-----------------+
|      b |        0x400000 |
+--------+-----------------+

<object val 1> Таблица символов

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|    one |        0x400004 |
+--------+-----------------+

"куча" :

+----------+-----------------+
| 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 |
+--------+-----------------+

"куча" :

+----------+-----------------+
| Location | Value           |
+----------+-----------------+
| 0x400000 | <object val 1>  |
+----------+-----------------+
| 0x400004 | <object val 2>  | 
+----------+-----------------+

.

<час>

После ячеек памяти к "куче" должен, надо надеяться, прояснить, почему Вы получили вывод, который Вы сделали.

Теперь вещи становятся еще более интересными, потому что теперь Вы делаете:

a['two'] = 2;

хорошо, поэтому давайте возьмем это шаг за шагом.

  • a точки к ячейке памяти 0x400004, который содержит <object val 2>
  • <object val 2>, являются пустым объектом, таким образом его таблица символов начинается пустая
  • Путем выполнения этой строки, мы добавляем переменную 'два' к [1 123] таблица символов.

, Если Вы еще не устали от рассмотрения этих схем, Вы будете. Вещи теперь похожи на это:

<час>

Глобальная Таблица символов :

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|      a |        0x400004 |
+--------+-----------------+
|      b |        0x400000 |
+--------+-----------------+

<object val 1> Таблица символов

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|    one |        0x400004 |
+--------+-----------------+

<object val 2> Таблица символов

+--------+-----------------+
| Symbol | Memory Location |
+--------+-----------------+
|    two |        0x400008 |
+--------+-----------------+

"куча" :

+----------+-----------------+
| Location | Value           |
+----------+-----------------+
| 0x400000 | <object val 1>  |
+----------+-----------------+
| 0x400004 | <object val 2>  | 
+----------+-----------------+
| 0x400008 | 2 (literal val) |    <-- yes, even integers are stored on the heap
+----------+-----------------+        in JavaScript.

.

<час>

, Если Вы старательно не торопитесь для следования за ячейками памяти, Вы будете видеть, что Ваш браузер отобразил корректный вывод.

45
ответ дан 31 October 2019 в 13:03

Думайте об анонимном объекте как о нем наличии имени:

a = {}; // The variable "a" now points to (holds) an anonymous object.
b = a; // "b" points to the same anonymous object held by "a".
a = 123; // "a" now holds some other value.
b; // "b" still holds the anonymous object.

ключ должен помнить, что переменные содержат ссылки на объекты , не ссылки на другие переменные. И тот же объект может быть упомянут любым количеством переменных.

9
ответ дан 31 October 2019 в 13:03

Объекты в JavaScript могут существовать собой, не нуждаясь в имени. Например:

{}

новый экземпляр объекта словаря.

a = {};

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

b = a;

делает b, относятся к тому же основному объекту. Можно затем сделать a точка где-то в другом месте:

a = "hi";

и b неподвижные точки к тому же словарю возражают, что он сделал прежде. Поведение b не связано с тем, как Вы изменяетесь что a точки к.

6
ответ дан 31 October 2019 в 13:03

Насколько я знаю Вас overwrited , таким образом, я предполагаю, что механизм сохраняет его в другом пространстве памяти, тогда как b, все еще указывающий на старое адрес памяти (который так или иначе не становится уничтоженным).

0
ответ дан 31 October 2019 в 13:03