Мы часто говорим, что переменные содержат значения. Что же они содержат в действительности? Чтобы ответить на этот, казалось бы, простой вопрос, мы должны снова взглянуть на типы данных, поддерживаемые JavaScript. Эти типы можно разделить на две группы: элементарные и ссылочные.
Числа, логические значения, а также значения null и undefined – это элементарные типы. Объекты, массивы и функции – это ссылочные типы.
Элементарный тип имеет фиксированный размер. Например, число занимает восемь байтов, а логическое значение может быть представлено всего одним битом. Числовой тип – самый большой из элементарных типов.
Если для каждой JavaScript-переменной зарезервировано в памяти восемь байтов, переменная может непосредственно содержать значение любого элементарного типа.
Однако ссылочные типы – это другое дело. Например, объекты могут быть любой длины – они не имеют фиксированного размера. То же самое относится и к массивам: массив может иметь любое число элементов. Аналогично функция может содержать любой объем JavaScript-кода. Поскольку данные типы не имеют фиксированного размера, их значения не могут непосредственно храниться в восьми байтах памяти, связанных с каждой переменной. Поэтому в переменной хранится ссылка на это значение. Обычно эта ссылка представляет собой какой-либо указатель или адрес в памяти. Ссылка – это не само значение, но она сообщает переменной, где это значение можно найти.
Различие между элементарными и ссылочными типами существенно, т.к. они ведут себя по-разному. Рассмотрим следующий код, оперирующий числами (элементарный тип):
var a = 3.14; // Объявление и инициализация переменной
var b = a; // Копирование значения переменной в новую переменную
a = 4; // Модификация значения исходной переменной