Объекты и ссылки12 / 19

Memory Heap: где хранятся объекты

Как две переменные обращаются к одному объекту в памяти.

Когда программа создаёт объект { hp: 100 }, его данные нужно где-то хранить. V8 использует для хранения объектов область памяти, которую называют heap.

Рассмотрим, как создаётся объект и появляется вторая ссылка:

const player = { hp: 100 };
const target = player;
target.hp = 80;
// player.hp is also 80
  1. const player = { hp: 100 } создаёт объект игрока. На интерактивной схеме V8 выделяет для него память в куче и сохраняет там свойство hp. Переменная player получает ссылку на этот объект.
  2. const target = player читает значение player и присваивает его target. Так копируется ссылка: обе переменные теперь позволяют обратиться к тому же объекту. Второй объект не создаётся.
  3. target.hp = 80 обращается по ссылке к объекту и изменяет его свойство hp. Сами ссылки не меняются. Поэтому player.hp тоже становится равно 80.
player
target
Heap · память объектов
Один объект игрока{ hp: 80 }
Состояние после target.hp = 80. Обе стрелки ведут к одному объекту.

На схеме показаны связи между переменными и объектом. Реальное размещение данных в памяти определяет движок. Ниже выполним пример по строкам: объект, ссылки и значения свойств будут появляться по мере выполнения.

Выполнение по строкам

Интерактивная схема. #1 — условная метка объекта, не адрес памяти.

  1. const player = { hp: 100 }; Следующая
  2. const target = player;
  3. target.hp = 80;

Переменные

playerСтрока ещё не выполнена
targetСтрока ещё не выполнена

Heap · куча

Объект примера ещё не создан
player.hp
—
target.hp
—

Строки примера ещё не выполнены. Начнём с создания объекта.

Выполнено 0 из 3
Основной вывод

Heap (куча) хранит объекты и их данные. Переменная даёт доступ к объекту через ссылку. При присваивании её значения другой переменной копируется ссылка, а не объект.

Проверить по первоисточнику ↗

ECMA-262 · Object Type↗Объекты и их свойства. Спецификация не задаёт точное размещение объектов в памяти.V8 · Heap and allocation↗Управляемая память объектов и её сборка в V8.ECMA-262 · GetValue↗Чтение переменной возвращает её значение; для объекта это тот же объект, без копирования его свойств.