Присвоение по ссылке и по значени
Last updated
Last updated
Фундаментальным отличием сложных типов от примитивов, является то, как они хранятся и копируются.
Примитивы: строки
, числа
, були
,null
и undefined
, при присваивании копируются целиком, по значению (by value).
Со сложными типами всё не так. В переменной, которой присвоен массив или объект, хранится не само значение, а адрес его места в памяти, иными словами — ссылка (указатель) на него и передаются они по ссылке (by reference).
Представим переменную в виде листа бумаги. Значение этой переменной мы представим в виде записи на этом листе.origi
Если мы захотим сообщить содержимое этой записи пользователям, то мы можем поступить так — сделать физические копии и вручить их каждому, то есть сделать множественные независимые копии (присвоение по значению).
Или поместить лист в закрытой комнате и дать пользователям ключ от этой комнаты, то есть 1 экземпляр с общим доступом (присвоение по ссылке).
При передаче по значению, переменным выделяется новая ячейка памяти и в нее копируется данные. Аналогия с множественными копиями бумажного листа имеет вполне реальное воплощение, отдельный лист для каждой копии.
При передаче по ссылке, вместо создания нового объекта, переменной присваивается ссылка (указатель) на уже существующий объект, то есть на его место в памяти. Таким образом, несколько переменных могут указывать на один и тот же объект, по аналогии с закрытой комнатой, у них есть ключ доступа к оригиналу листа.
Все примитивные типы присваиваются по значению, то есть создается копия.
Сложные типы - объекты, массивы, функции присваиваются по ссылке, то есть переменная просто получает ссылку на уже существующий объект.