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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Главное правило JavaScript заключается в следующем: операции над элементарными типами производятся по значению, а над ссылочными типами, как и следует из их названия, – по ссылке. Числа и логические величины – это элементарные типы в JavaScript. Представителями ссылочных типов являются объекты. Массивы и функции – это специализированные типы объектов и потому также являются ссылочными типами.

В примере 3.1 выполняется копирование, передача и сравнение чисел. Поскольку числа являются элементарными типами, данный пример является иллюстрацией операций, выполняемых по значению.

Пример 3.1. Копирование, передача и сравнение величин по значению

// Первой рассматривается операция копирования по значению

var n = 1; // Переменная n хранит значение 1

var m = n; // Копирование по значению: переменная m хранитдругое значение 1

// Данная функция используется для иллюстрации операции передачи величины по значению

// Как вы увидите, функция работаетне совсем так,как хотелось бы

function add_to_total(total, x)

{

total = total + x; // Эта строка изменяет лишь внутреннюю копию total

}

// Теперь производится обращение к функции, которой передаютсяпо значению числа,

// содержащиеся в переменныхn и m. Копия значения из переменной n внутри функции

// доступна под именем total. Функция складывает копии значений переменных m и n,

// записывая результат в копию значения переменной n. Однако это не оказывает

// никакого влияния на оригинальное значение переменной n за пределами функции.

// Таким образом, в результате вызова этой функции мы не получаем никаких изменений.

add_to_total(n, m);

// Сейчас мы проверим операцию сравнения по значению.

// В следующей строке программы литерал 1 представляет собой совершенно

// независимое числовое значение, "зашитое" в текст программы. Мы сравниваем

// его со значением, хранящимся в переменной n. В данном случае, чтобы

// убедиться в равенстве двух чисел, выполняется их побайтовое сравнение.

if (n == 1) m = 2; // n содержит то же значение, что и литерал 1;

// таким образом в переменную m будет записано значение 2

Теперь рассмотрим пример 3.2. В этом примере операции копирования, передачи и сравнения выполняются над объектами. Поскольку объекты относятся к ссылочным типам, все действия над ними производятся по ссылке. В данном примере использован объект Date.

Пример 3.2. Копирование, передача и сравнение величин по ссылке

// Здесь создается объект, который соответствует дате Рождества в 2007 году

// Переменная xmas хранит ссылку на объект, а не сам объект

var xmas = new Date(2007, 11, 25);

// Затем выполняется копирование ссылки, получается втораяссылка на оригинальный объект

var solstice = xmas; // Обе переменныессылаются на тот же самый объект

// Здесь выполняется изменение объекта с помощью новой ссылки

solstice.setDate(21);

// Изменения можно наблюдать при использовании первой ссылки

xmas.getDate(); // Возвращает 21, а не первоначальное значение 25

// То же происходит при передачеобъектов и массивов в функции.

// Следующая функция складывает значения всех элементов массива.

// Функции передаетсяссылка на массив, а не копия массива.

// Благодаря этому функция может изменять содержимое массива,переданного

// по ссылке, и эти изменения будут видны после возврата из функции.

function add_to_totals(totals, x)

{

totals[0] = totals[0] + x;

totals[1] = totals[1] + x;

totals[2] = totals[2] + x;

}

// Наконец, далее выполняется операция сравнения по ссылке.

// При сравнении двух переменных, созданных ранее, обнаруживается,

// что они эквивалентны, поскольку ссылаются на один и тот же объект даже

// при том, что производилось изменение даты по одной из них:

(xmas == solstice) // Возвращает значение true

// Две переменные, созданные позднее, ссылаются на разные объекты,

// каждый из которых содержит однуи ту же дату.

var xmas = new Date(2007, 11, 25);

var solstice_plus_4 = new Date(2007, 11, 25);

// Но согласно правилу "сравнения по ссылке" ссылки на разные объекты // не считаются эквивалентными!

(xmas!= solstice_plus_4) // Возвращает значение true

 

Пример 3.3. Ссылки передаются по значению

// Здесь приводится другая версия функции add_to_totals(). Хотя она не работает,

// потому что вместо изменения самого массива она изменяет ссылку на этот массив.

function add_to_totals2(totals, x)

{

newtotals = new Array(3);

newtotals[0] = totals[0] + x;

newtotals[1] = totals[1] + x;

newtotals[2] = totals[2] + x;

totals = newtotals; // Эта строка не оказывает влияния

// на массив за пределами функции

 

Таблица 4.3 По ссылке или по значению: подведение итогов

Тип Копирование Передача Сравнение
Число По значению По значению По значению
Логическое значение По значению По значению По значению
Строка Не изменяется Не изменяется По значению
Объект По ссылке По ссылке По ссылке

Типизация переменных

Самое важное различие между JavaScriptи такими языками, как Java и C, состоит в том, что JavaScript – это нетипизированный (untyped) язык. В частности, это значит, что JavaScript-переменная может содержать значение любого типа, в отличие от Java- или C-переменной, в которой может содержаться только определенный тип данных, заданный при ее объявлении. Так, в JavaScript можно присвоить переменной число, а затем присвоить той же переменной строку:

i = 10;

i = "десять";

 

Объявление переменных

Прежде чем использовать переменную в JavaScript, ее необходимо объявить. Переменные объявляются с помощью ключевого слова varследующим образом:

var i;

var sum;

Можно объявить несколько переменных:

var i, sum;

Кроме того, объявление переменной можно совмещать с ее инициализацией:

var message = "hello";

var i = 0, j = 0, k = 0;

Если начальное значение не задано в инструкции var, то переменная объявляется, но ее начальное значение остается неопределенным (undefined), пока не будет изменено программой.

Обратите внимание, что инструкция varтакже может включаться в циклы for и for/in, что позволяет объявлять переменную цикла непосредственно в самом цикле. Например:

for(var i = 0; i < 10; i++) document.write(i, "<br>");

 



Поделиться:


Последнее изменение этой страницы: 2016-12-28; просмотров: 345; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.183.1 (0.013 с.)