Элементарные и ссылочные типы
Мы часто говорим, что переменные содержат значения. Что же они содержат в действительности? Чтобы ответить на этот, казалось бы, простой вопрос, мы должны снова взглянуть на типы данных, поддерживаемые JavaScript. Эти типы можно разделить на две группы: элементарные и ссылочные.
Числа, логические значения, а также значения null и undefined – это элементарные типы. Объекты, массивы и функции – это ссылочные типы.
Элементарный тип имеет фиксированный размер. Например, число занимает восемь байтов, а логическое значение может быть представлено всего одним битом. Числовой тип – самый большой из элементарных типов.
Если для каждой JavaScript-переменной зарезервировано в памяти восемь байтов, переменная может непосредственно содержать значение любого элементарного типа.
Однако ссылочные типы – это другое дело. Например, объекты могут быть любой длины – они не имеют фиксированного размера. То же самое относится и к массивам: массив может иметь любое число элементов. Аналогично функция может содержать любой объем JavaScript-кода. Поскольку данные типы не имеют фиксированного размера, их значения не могут непосредственно храниться в восьми байтах памяти, связанных с каждой переменной. Поэтому в переменной хранится ссылка на это значение. Обычно эта ссылка представляет собой какой-либо указатель или адрес в памяти. Ссылка – это не само значение, но она сообщает переменной, где это значение можно найти.
Различие между элементарными и ссылочными типами существенно, т.к. они ведут себя по-разному. Рассмотрим следующий код, оперирующий числами (элементарный тип):
var a = 3.14; // Объявление и инициализация переменной
var b = a; // Копирование значения переменной в новую переменную
a = 4; // Модификация значения исходной переменной
alert(b) // Показывает 3.14; копия не изменилась
Теперь посмотрим, что произойдет, если слегка изменить код, заменив числа массивами (ссылочный тип):
var a = [1,2,3]; // Инициализируем переменную ссылкой на массив
var b = a; // Копируем эту ссылку в новую переменную
a[0] = 99; // Изменяем массив, используя первоначальную ссылку
alert(b); // Показываем измененный массив [99,2,3], используя новую ссылку
Обратите внимание, что выполняется присваивание ссылки на значение типа «массив», а не присваивание самого массива. После второй строки фрагмента мы все еще имеем один объект массива; нам только удалось получить две ссылки на него.
Относятся ли строки в JavaScript к базовым или к ссылочным типам? Строки – это необычный случай. Они имеют переменную длину и потому, очевидно, не могут храниться непосредственно в переменных фиксированного размера. Исходя из соображений эффективности можно ожидать, что интерпретатор JavaScript будет копировать ссылки на строки, а не их фактическое содержимое.
В то же время во многих отношениях строки ведут себя как элементарные типы. Вопрос о том, к какому типу принадлежат строки, элементарному или ссылочному, спорный, т. к. строки на самом деле неизменны: нет возможности избирательно изменить содержимое внутри строкового значения.
Дата добавления: 2015-08-01; просмотров: 613;