Элементарные и ссылочные типы

Мы часто говорим, что переменные содержат значения. Что же они содержат в действительности? Чтобы ответить на этот, казалось бы, простой вопрос, мы должны снова взглянуть на типы данных, поддерживаемые 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; просмотров: 558;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.