В JavaScript важно понимать разницу между примитивными и ссылочными типами данных.
Переменные
Переменная – это строительный блок любого языка программирования. Она может изменять своё значение. Цель переменной – хранить значение, которое можно использовать многократно. Переназначение переменной – это присвоение ей нового значения. Изменение значения переменной означает изменение самой переменной. Само значение – это запись в памяти, имеющая определённый тип. Все типы значений в JavaScript делятся на две группы: примитивные и ссылочные. Различие обусловлено способом хранения значений в памяти.
Примитивные типы данных
В JavaScript существует шесть примитивных типов данных:
- string (строка) – например, «Hello world»
- boolean (булево) – true или false
- number (число) – 0, -5, 7, 5.2, 10.7 и т.д.
- null (нулевое) – ничего
- undefined (неопределённое) – неопределённое значение
- symbol (символ) – например, Symbol.iterator (введён в ECMAScript 2015).
Ссылочные типы данных
В JavaScript существует только один ссылочный тип данных: object. Массивы и функции в JavaScript – это объекты. Практически всё в JavaScript – это объект.
Разница между примитивными и ссылочными типами
Примитивные типы хранятся в памяти в отдельных ячейках. Например, строка «Hello world» хранится как последовательность нулей и единиц в отдельной области памяти. Значения можно читать и перезаписывать в новые области памяти. То же самое справедливо для boolean и number.
В случае ссылочных типов, значения хранятся не напрямую, а в двух местах:
- Указатель (pointer): Хранит местоположение объекта в памяти.
- Область памяти: Здесь хранится само значение объекта.
Разные указатели могут указывать на одно и то же место в памяти, где хранится значение ссылочного типа. Изменение значения ссылочного типа изменяет его в единственном месте в памяти; все указатели по-прежнему указывают на это обновлённое место.
Пример работы со ссылочными типами
Рассмотрим пример:
let a = { a: 10, b: 20 };
let copyOfA = a;
copyOfA.a = 20;
console.log(a.a); // Выведет 20
Переменная a хранит указатель на объект. copyOfA – это копия указателя, а не самого объекта. Изменение свойства a в copyOfA изменяет объект в памяти, и это изменение отразится при доступе к свойству a через переменную a.
Резюме
- В JavaScript только один ссылочный тип – object.
- Значения ссылочного типа хранятся в памяти вместе с указателями.
- Практически всё в JavaScript является объектом.