Fundamentall, я думаю, что ваша диаграмма в основном правильная, по крайней мере, в основной идее, что объект является определенной областью памяти со слотами для его свойств.
Фактическая структура памяти не определена спецификациейи может варьироваться от движка JavaScript до движка JavaScript.
Что спецификация должна сказать , это то, что
Объект логически представляет собой набор свойств.
... где свойства данных, такие как a
и b
, имеют имя и значение.1 - это значение, а объект - это значение (подробнее об этом чуть позже).Спецификация не затрагивает вопрос о том, как на значения ссылаются из разных мест.
Современные современные движки JavaScript создают классы «на лету» для оптимизации доступа к свойству, поскольку доступ к свойству является очень распространенной операцией.Они также обрабатывают объекты через ссылки на объекты , которые являются значениями, указывающими, где реальный объект находится в другом месте в памяти от ссылки.В современном движке вполне вероятно, что ваш объект реализован с помощью слотов памяти для a
и b
, оба из которых, вероятно, имеют размер 64 бита (но я не знаю, что может варьироваться), и что значение 1 равносохраняется непосредственно в слоте, а ссылка на объект для b
(которая, опять же, указывает на объект в другом месте в памяти) также сохраняется непосредственно в слоте.Детали будут различаться в зависимости от движка.
Так, например, ваш код может создать что-то подобное в памяти (не учитывая много деталей):
+−−−−−−−−−−+
o: Ref33454−−−−−−−−−−−−−−−−−−−−−−+−>| (Object) |
| +−−−−−−−−−−+
| +−−−−−−−−−−+
|
+−−−−−−−−−−−−−−+ |
o2: Ref54612−−−>| (Object) | |
+−−−−−−−−−−−−−−+ |
| a: 1 | |
| b: Ref33454 |−+
+−−−−−−−−−−−−−−+
Примечание:
Поскольку это объект, он хранится в куче памяти.
Это неверное предположение.Если это происходит, например, в функции, и функция используется настолько, что движок JavaScript решает активно ее оптимизировать, одна из таких оптимизаций, используемая V8 (по крайней мере), заключается в том, чтобы определить, полностью ли содержится срок жизни объекта в функции.вызовите и, если это так, разместите его в стеке, поскольку распределение и очистка стека происходит очень быстро.Таким образом, вполне возможно, что объект находится в стеке, а не в куче (и, если я правильно помню, возможно, чтобы он был скопирован из стека в кучу, если это необходимо, поскольку в некоторых путях кода онвыживает после завершения вызова функции).