11.1. Работа с информацией
11.2. Переменные и типы данных
11.3. Выражения
11.4. Условия и циклы
11.5. Функции и события
11.6. Встроенные объекты JavaScript
Рта глава является незаменимой для новичков, так как РІ ней разъясняются основные элементы языка JavaScript: переменные, типы данных, выражения, различные операторы, функции Рё С‚.В Рґ. Рти знания являются базовыми – без РЅРёС… невозможно понимание остального материала РєРЅРёРіРё.
11.1. Работа с информацией
Любая программа или сценарий работают с информацией, то есть получают некие данные, обрабатывают их согласно своему алгоритму, а затем обычно возвращают результат в виде изображения на экране или бумаге, звука, файла, сигнала другой программе и т. д.
Серверные программы получают данные либо от пользователя, например через формы, либо из баз данных. При этом в качестве обрабатываемой информации могут выступать абсолютно любые данные: опросы, регистрационные данные, фотографии, почта, статистические данные.
Клиентские сценарии часто выступают буфером между пользователем и серверной программой, осуществляя предварительную обработку и верификацию данных. Следовательно, они работают с теми же данными.
Клиентские сценарии могут получать информацию различными способами, которые описаны ниже.
• Рнформация может быть заложена РІ сценарий разработчиком. Обычно это некие начальные значения.
• Рнформация может передаваться РѕС‚ пользователя СЃ помощью форм.
• Передача через URL.
• Получение информации обработкой событий, например после перемещения указателя мыши, щелчка кнопкой мыши, нажатия клавиш.
• Получение данных с других сайтов или передача серверной программой.
Для знакомства с вводом/выводом информации в JavaScript понадобятся три метода: alert(), prompt() и confirm().
Рти методы генерируют различные РѕРєРЅР° сообщений.
Примечание
В действительности методы alert(), prompt() и confirm() являются методами объекта Window в браузере.
Метод alert()
Метод alert() отображает окно предупреждения с соответствующим сообщением. После прочтения сообщения пользователю необходимо нажать кнопку OK, чтобы закрыть окно. Аргументом данного метода является строка.
Примечание
О типах данных в JavaScript, в том числе и о строках, будет рассказано далее в этой главе.
В простейшем случае текст предупреждения, заключенный в кавычки, вводится внутри круглых скобок (листинг 11.1).
Листинг 11.1. Работа с предупреждением
Окно предупреждения генерируется самим браузером, поэтому внешний вид окна в разных браузерах может различаться. На рис. 11.1, 11.2 и 11.3 представлен вид окна, сгенерированного в трех популярных браузерах с помощью описанного кода.
Рис. 11.1. Окно предупреждений в браузере Internet Explorer
Рис. 11.2. Окно предупреждений в браузере Mozilla Firefox
Рис. 11.3. Окно предупреждений в браузере Opera
Метод prompt()
Метод prompt() имеет противоположное предназначение. Он служит для получения данных от пользователя (листинг 11.2). При его вызове отображается окно приглашения с текстовым полем. Метод может содержать два аргумента. Оба этих аргумента должны быть строками. Первый аргумент – сообщение, которое отображается в окне. Второй аргумент – это текст по умолчанию, который должен появиться в соответствующем поле. Кроме того, этот метод, в свою очередь, возвращает значение, которое также является строкой, – это текст, который ввел пользователь.
Листинг 11.2. Работа с запросом
После запуска страницы с вышеприведенным кодом появится запрос (рис. 11.4), вслед за которым отобразится предупреждение.
Рис. 11.4. Работа с запросом
В этом примере для демонстрации работы метода prompt() использована переменная, а в методе alert() в качестве аргумента выступает выражение. Данные понятия будут введены далее в этой главе.
Примечание
В методе prompt() можно опустить второй аргумент, то есть указывать только одну строку. В этом случае различные браузеры по-разному реагируют: строка запроса может быть пустой, а может отображать ключевое слово undefined (не определено).
Метод confirm()
Метод confirm() отображает окно подтверждения, которое сходно с окном предупреждения, генерируемым методом alert(), но содержит две кнопки: OK и Cancel. В листинге 11.3 демонстрируется создание окна подтверждения, но в этом сценарии не делается разницы между кнопками OK и Cancel. Нажатие любой из кнопок просто закроет окно (рис. 11.5).
Рис. 11.5. Работа с подтверждением
Листинг 11.3. Работа с подтверждением
После прочтения данной главы вы научитесь использовать этот метод, чтобы сценарий по-разному реагировал на нажатие кнопок OK и Cancel.
11.2. Переменные и типы данных
Р’Рѕ время интерпретации сценария браузер разбивает РєРѕРґ РЅР° отдельные слова, фразы или символы, которые умеет распознавать. Рти элементы называются лексемами. Р’ языке JavaScript лексемы делятся РЅР° четыре типа: идентификаторы, ключевые слова, литералы Рё операции.
Рдентификаторы
Рдентификаторами называются имена, которые обозначают переменные, функции Рё объекты. Некоторые имена являются ключевыми или зарезервированными Рё РЅРµ РјРѕРіСѓС‚ использоваться РІ качестве идентификатора, так как имеют особый смысл. Рћ РЅРёС… будет рассказано далее.
Рдентификаторы образуются СЃ помощью комбинации различных символов, однако РїСЂРё этом накладываются некоторые ограничения.
• Все идентификаторы должны начинаться с буквы.
• После первой буквы остальными символами могут быть буквы и цифры.
• Буквами считаются заглавные и строчные буквы латинского алфавита: от A до Z и от a до z.
• Символ подчеркивания (_) выступает в качестве буквы и часто используется вместо пробела, который нельзя применять в идентификаторах.
• Символ доллара ($) выступает в качестве буквы и обычно используется при автоматической генерации кода.
• Можно использовать в качестве букв символы Unicode, однако старые версии браузеров не умеют работать с Unicode.
• Цифрами считаются символы от 0 до 9.
Совет
Не следует использовать в одном сценарии идентификаторы, отличающиеся только символами верхнего и нижнего регистра, например flagld и FlagID, так как это будут различные идентификаторы, которые могут вызвать трудноуловимые ошибки.
В табл. 11.1 приведены примеры допустимых и недопустимых идентификаторов.
Таблица 11.1. Примеры идентификаторов JavaScript
Обратите внимание, что идентификатор new хотя и содержит разрешенные символы, но относится к числу ключевых слов, поэтому не может выступать в качестве пользовательского идентификатора.
Ключевые и зарезервированные слова
Рљ ключевым словам относятся предопределенные идентификаторы, которые образуют СЏРґСЂРѕ языка JavaScript. Рти слова имеют особый смысл Рё выполняют определенные функции. Ключевые слова РЅРµ РјРѕРіСѓС‚ использоваться для пользовательских идентификаторов. Р’ табл. 11.2 представлен СЃРїРёСЃРѕРє ключевых слов JavaScript.
Таблица 11.2. Ключевые слова JavaScript
Зарезервированные слова не рекомендуется использовать в качестве пользовательских идентификаторов, так как в последующем планируется использовать их в качестве ключевых слов. Список зарезервированных слов приведен в табл. 11.3.
Таблица 11.3. Зарезервированные слова JavaScript
Совет
Конечно, вы можете использовать зарезервированные слова для своих идентификаторов, но это не гарантирует работоспособности ваших сценариев в будущем, когда зарезервированные слова могут перейти в состав ключевых.
Литералы
Литералы – это числа или строки, которые применяются для представления значений в JavaScript. Поскольку информация может быть разнообразной, то значения могут быть различных видов. Простейшие типы данных в JavaScript называют основными типами данных: числа, строки и логические значения.
Числа
В языке JavaScript различают два типа чисел: целые числа и числа с плавающей точкой.
Целочисленные величины могут быть положительными, например 1, 2, 3, и отрицательными, например -1, -2, -3. К целочисленным величинам также относится нуль – 0. Кроме того, целочисленные величины могут быть выражены в десятичной, восьмеричной или шестнадцатеричной системах счисления.
Числа в десятичном формате могут включать любую последовательность цифр от 0 до 9, которая не начинается с нуля.
Числа в восьмеричном формате могут включать любую последовательность цифр от 0 до 7, которая обязательно начинается с нуля.
Числа в шестнадцатеричном формате могут включать любую последовательность цифр от 0 до 9 и буквы от a до f, которая обязательно начинается с 0x.
В табл. 11.4 рассмотрены примеры представления целых чисел в различных форматах.
Таблица 11.4. Примеры целых чисел
Совет
Будьте внимательны с использованием восьмеричного формата, так как обычно браузеры интерпретируют числа как десятичные, даже если они начинаются с нуля, если в их составе есть цифры 8 или 9. Например, число 076 – это 62, а 078 – это 78.
Числа СЃ плавающей точкой определяют десятичные числа СЃ РґСЂРѕР±РЅРѕР№ частью. Рти числа РјРѕРіСѓС‚ быть выражены РІ обычном или экспоненциальном РІРёРґРµ. Р’ последнем случае для представления РїРѕСЂСЏРґРєР° используется СЃРёРјРІРѕР» e или E. Рдесятичная мантисса, Рё РїРѕСЂСЏРґРѕРє РјРѕРіСѓС‚ быть положительными или отрицательными. Ниже показаны примеры чисел СЃ плавающей точкой:
1,4142135623730950488016887242097
–35.0
4567.0002
3.4e100
–5.456e–3
0.007
Внимание!
Число, начинающееся с нескольких нулей и содержащее десятичную точку, например 000.45, расценивается некоторыми браузерами как ошибка.
Примечание
Числа с плавающей точкой могут быть очень большими и очень маленькими: от 10 -323 до 10 308 .
Логические величины
В языке JavaScript есть поддержка логических типов данных, которые могут принимать лишь два значения: true (истина) и false (ложь). Логические (булевые) величины необходимы для работы с условиями, с которыми вы познакомитесь дальше в этой главе.
Внимание!
Ключевые слова true и false обязательно должны вводиться буквами нижнего регистра.
Строки
Наверное, наиболее часто используемым типом данных РІ JavaScript является строка. Строка – это набор символов, возможно пустой, заключенный РІ одинарные или двойные кавычки. Рспользование РґРІСѓС… типов кавычек введено потому, что строка может содержать Рё кавычки какого-либо РІРёРґР°. Далее представлены примеры строковых литералов:
«Строка текста»
"Р РѕСЃСЃРёСЏ!"
"4567"
""
'Операционные системы'
'Льюис Кэрролл "Алиса в стране чудес"'
Специальные символы
РРЅРѕРіРґР° может возникнуть необходимость дать компьютеру команду РЅР° использование специальных символов, например табуляции или перевода строки. Чтобы ввести РІ строку любой Unicode-СЃРёРјРІРѕР», нужно указать его РєРѕРґ после \u РІ РІРёРґРµ \uXXXX. Р’ табл. 11.5 представлены наиболее часто используемые управляющие символы.
Таблица 11.5. Управляющие символы
Часто управляющие символы используются для выравнивания данных (листинг 11.4).
Листинг 11.4. Выравнивание с помощью управляющих символов
Поскольку окно, создаваемое методом alert(), зависит от браузера, то и выравнивание в различных браузерах происходит по-разному. На рис. 11.6 показан результат выполнения вышеприведенного кода, адаптированного к браузеру Internet Explorer.
Рис. 11.6. Выравнивание с помощью управляющих символов
Специальные типы данных
Помимо чисел, строк и логических величин, существует еще два типа данных: функции и объекты. Функции могут быть встроенными, например alert(), а могут быть созданы разработчиком. Кроме того, функции могут принадлежать объекту, тогда они называются методами. Объекты также могут быть встроенными, например document, а могут быть созданы программистом. Считается, что значение null является объектом.
Если браузер не может определить тип данных, то он присваивает им значение undefined (неопределяемый).
Переменные
Переменная – это имя, присваиваемое ячейке памяти компьютера, которая хранит определенные данные во время работы сценария. Переменные есть в каждом языке программирования, даже в низкоуровневом языке Ассемблер. Они облегчают программисту работу по манипулированию с данными.
РРјСЏ переменной является идентификатором, поэтому подчиняется тем же правилам.
Объявление переменных
Объявление переменной означает, что вы даете команду зарезервировать место для хранения данных, при этом указанный идентификатор будет использоваться в качестве имени переменной. Чтобы объявить переменную, надо после ключевого слова var указать ее идентификатор. Можно сразу объявить несколько переменных, задав их имена через запятую.
Рассмотрим примеры объявлений переменных:
var myData1;
var x,y,z;
var k, msg1, msg2, IM;
В процессе объявления переменную можно проинициализировать, то есть установить для нее начальное значение:
var myStr="Здравствуйте, ";
var k=1000, x=12, y=-5;
var s=1.34e–5, msg11="Error", Flag=false;
Пока переменная не получит значение, она не определена – undefined. Чтобы определить тип переменной, можно использовать операцию typeof, которая возвращает строку с типом переменной (листинг 11.5).
Листинг 11.5. Типы данных
Типы данных
В вышеприведенном коде для вывода информации используется метод document. write(), который позволяет дописывать строку текста прямо в страницу (рис. 11.7).
Рис. 11.7. Типы данных
Для вывода текста, значений переменных и их типа аргументом данного метода выступает довольно сложное выражение. Более подробно выражения будут рассмотрены далее в этой главе.
Совет
Язык JavaScript относится к числу языков, слабо контролирующих типы данных, поэтому одна переменная может в ходе работы сценария принимать значения различных типов. Однако такого следует избегать, так как это может привести к трудноуловимым ошибкам и усложнить понимание кода.
Область действия переменных
Переменные могут быть глобальными и локальными. Понятие области действия переменных тесно связано с функциями, которые являются отдельными блоками кода. Переменная, объявленная внутри функции, является локальной, и только эта функция имеет доступ к ее значению. Локальные переменные создаются и уничтожаются вместе с соответствующей функцией. Глобальные переменные должны объявляться вне функций. Такие переменные позволяют функциям обмениваться данными.
Массивы
Массив – это особая переменная, позволяющая хранить сразу несколько значений. Обычно эти значения связаны между собой, например массив может содержать названия месяцев. Массивы могут существенно упростить код и при использовании циклов снизить трудоемкость разработки сценария.
Рассмотрим пример объявления и задания значений элементов массива (листинг 11.6).
Листинг 11.6. Работа с массивом
Обратите внимание, что при объявлении массива количество элементов указывается в круглых скобках, а при обращении к элементу его индекс указывается в квадратных скобках. Кроме того, в языке JavaScript нумерация элементов массива начинается с нуля, поэтому первый элемент массива – stars[0].
Язык JavaScript позволяет не перечислять все элементы по одному, а сразу вывести все элементы массива. Для этого необходимо обратиться к самому массиву, в результате чего получится строка, в которой все элементы массива перечислены через запятую (рис. 11.8).
Рис. 11.8. Вывод всех элементов массива
Значения элементов массива можно задать при его объявлении, тогда не нужно указывать количество элементов в массиве (листинг 11.7).
Листинг 11.7. Рнициализация массива
Размерность массива можно не указывать, так как язык JavaScript этого не требует. Таким образом, можно постепенно расширять массив по мере добавления данных. Более того, можно объявить элемент с индексом n, что увеличит длину массива до n+1. Узнать длину массива можно с помощью свойства length (листинг 11.8).
Листинг 11.8. Размер массива
Несмотря на то что фактически элементов в массиве шесть, длина массива равна 100 (рис. 11.9).
Рис. 11.9. Размер массива
11.3. Выражения
Выражения являются комбинациями операндов с помощью операций. Обычно в качестве операндов выступают значения и переменные, но могут выступать и другие выражения. Например, выражение 4 + 6 складывает два значения, в результате чего получается значение 10. А выражение q=5 присваивает переменной q значение 5. Если манипуляции производятся с одной величиной, то операция называется унарной, а если с двумя, то бинарной. Рассмотрим операции в JavaScript.
Операции присвоения
Одной из часто используемых операций является операция присвоения. В простейшем случае эта операция присваивает значение переменной:
a=7
Она может одновременно использоваться для нескольких переменных:
msg1=msg2="Привет"
Остальные операции присваивания являются комбинацией операции присваивания и арифметической или поразрядной операции (табл. 11.6 и 11.7).
Таблица 11.6. Комбинация с арифметическими операциями
Таблица 11.7. Комбинация с поразрядными операциями
Арифметические операции
Для работы с числами используют арифметические операции.
• Сложение – знак плюс (+). Например, 5 + 7 = 12.
• Вычитание – знак минус (-). Например, 67 – 43 = 24.
• Умножение – звездочка (*). Например, 2 * 2 = 4.
• Деление – косая черта (/). Например, 45 / 5 = 9.
• Остаток от деления – процент (%). Например, 7 % 5 = 2.
В программировании очень часто встречаются операции увеличения или уменьшения переменной на единицу, которые называются операциями инкремента и декремента. Для обозначения инкремента используется последовательность ++, а для обозначения декремента – последовательность —. Например, i++ является альтернативой выражению i=i + 1. Различают префиксную и постфиксную форму этих операций. В случае префиксной операции сначала выполняется инкремент или декремент, а затем вычисляется выражение:
i = 4
++i * 2 = 10
Если же используется постфиксная операция, то сначала вычисляется выражение, а затем производится увеличение или уменьшение переменной:
i = 4
i++ * 2 = 8
Помимо инкремента и декремента, есть еще две унарные арифметические операции: унарный плюс и унарный минус. Унарный минус изменяет знак числа, а унарный плюс преобразует операнд в число.
В листинге 11.9 демонстрируется работа с арифметическими операциями.
Листинг 11.9. Арифметические операции
Арифметические операции
Р’ этом примере можно заметить, что арифметические операции подчиняются математическим правилам. Например, умножение совершается РґРѕ сложения (СЂРёСЃ.В 11.10). Рто выполняется Р·Р° счет приоритета операций, который можно изменить, используя СЃРєРѕР±РєРё.
Рис. 11.10. Арифметические операции
Операции сравнения
Операции сравнения используются для сопоставления операндов. В этих операциях операндами могут быть не только числа, но и строки, логические величины и объекты. В табл. 11.8 приведены все операции сравнения.
Таблица 11.8. Операции сравнения
В листинге 11.10 показана работа с операциями сравнения.
Листинг 11.10. Операции сравнения
Операции сравнения
В приведенном коде сравниваются переменные i = 5 и m2 = "5". Они считаются равными, но не идентичными (рис. 11.11).
Рис. 11.11. Операции сравнения
Операции над строками
Как уже говорилось, строки можно сравнивать. Кроме того, строки можно объединять с помощью операции конкатенации (+), что мы уже не раз делали. Например:
S1="Здравствуй";
S2=",";
S3="РњРёСЂ!";
S=S1+S2+" "+S3;
В итоге переменная S будет содержать строку «Здравствуй, Мир!».
Благодаря автоматическому приведению типов можно объединять числа и строки:
«год „+1984=“год 1984»
Логические операции
Логические операции позволяют комбинировать выражения, возвращающие логические величины. Язык JavaScript поддерживает три логические операции.
Операция логического Р(&&) возвращает true, если только оба операнда истинны. Например, (1<7)&&(3>2). При этом сначала вычисляется левый операнд. Если он ложен, то второй операнд не вычисляется, что надо учитывать. Так, в строке (3<1)&&(i++<7) операция инкремента переменной i не произойдет.
Операция логического РЛР(||) возвращает true, если хотя Р±С‹ РѕРґРёРЅ операнд истинен. Например, (2<3) || (1>2). РџСЂРё этом сначала вычисляется левый операнд. Если РѕРЅ истинен, то второй операнд РЅРµ вычисляется.
Операция логического НЕ (!) является унарной и изменяет значение логической величины на обратное.
Условные операции
В JavaScript есть одна тернарная операция?:, которая позволяет присвоить значение переменной в зависимости от выполнения условия. Рассмотрим следующий пример:
var sign = (a>=0) ? «Положительное»: «Отрицательное»;
В зависимости от результата выражения до вопросительного знака переменная принимает одно из значений: если значение истинно, то вычисляется выражение до двоеточия, если ложно, то выражение, стоящее после двоеточия. В данном случае, если переменная a больше или равна 0, переменная sign принимает значение «Положительное», иначе переменная sign принимает значение «Отрицательное».
Поразрядные операции
Очень редко в сценариях JavaScript используются поразрядные операции, позволяющие манипулировать числами на уровне битов. Различают поразрядные логические операции и поразрядные операции сдвига. Для хранения целочисленных значений в JavaScript выделяется 32 бита. Для демонстрации работы поразрядных операций лучше использовать двоичную систему (табл. 11.9 и 11.10).
Таблица 11.9. Поразрядные логические операции
Таблица 11.10. Поразрядные операции сдвига
Другие операции
Вы уже встречались с операцией typeof, которая возвращает строку с именем типа данных. В табл. 11.11 приведены результаты, возвращаемые этой операцией.
Таблица 11.11. Результаты работы операции typeof
Кроме того, существуют операции, позволяющие обратиться к элементу какой-то структуры данных. При работе с элементами массива используется операция индексирования массива [], позволяющая обратиться к элементу массива:
myArray[5]=56
Для доступа к элементу объекта используется точка (.):
РмяОбъекта.имяСвойства
11.4. Условия и циклы
Редко какая-либо программа или сценарий имеют линейный алгоритм. Обычно в ходе работы часто проверяются различные условия и в зависимости от результата принимаются какие-то решения. Для автоматизации работы в коде также используются циклы, которые позволяют намного снизить трудоемкость разработки.
Условные операторы
В процессе создания сценариев обычно требуется изменить порядок выполнения кода. В этом разделе рассматриваются механизмы ветвления, позволяющие выбирать одно из альтернативных действий в зависимости от условия.
Оператор if
Оператор if управляет последовательностью выполнения команд. Синтаксис этого оператора:
if (логическое выражение)
{
операторы
}
Сначала вычисляется логическое выражение, затем, если оно равно true, выполняются операторы, если же оно равно false, то операторы пропускаются и продолжается выполнение сценария.
Рассмотрим пример. Допустим, функция f(x) определяется следующим образом:
Для нахождения значения этой функции на определенной точке можно воспользоваться кодом, приведенным в листинге 11.11.
Листинг 11.11. Пример работы оператора if
С помощью этого кода можно легко найти значение данной функции в любой точке (рис. 11.12).
Рис. 11.12. Определение значения функции с помощью оператора if
Оператор if..else
Часто удобно использовать полную форму условного оператора if..else. С его помощью можно задать действия, которые необходимо выполнить, если логическое выражение равно false:
if (логическое выражение)
{
операторы1
}
else
{
операторы2
}
Более того, можно совместить else с другим оператором if. В этом случае можно рассмотреть несколько альтернативных вариантов и выполнить соответствующие операторы:
if (логическое выражение1)
{
операторы1
}
else if (логическое выражение2)
{
операторы2
}
else
{
операторы3
}
Теперь перепишем предыдущий сценарий для определения функции с помощью оператора if..else (листинг 11.12).
Листинг 11.12. Пример работы оператора if..else
Как видно из данного кода, фигурные скобки необязательны, если выполняется только один оператор. Однако рекомендуется всегда использовать их для облегчения чтения кода. Обратите внимание, что в целях оптимизации второй проверкой проверяется условие x>5.
Оператор switch
Оператор switch позволяет сравнить значение СЃ множеством РґСЂСѓРіРёС…. Ртого же эффекта можно достичь СЃ помощью нескольких операторов if, РЅРѕ оператор switch позволяет создавать наглядный Рё краткий РєРѕРґ. Ртот оператор дает возможность предусмотреть операторы РїРѕ умолчанию, которые выполняются, если РЅРµ найдено РЅРё РѕРґРЅРѕ соответствие:
switch (выражение)
{
case значение1:
операторы
case значение2:
операторы
..
default:
операторы
}
Допустим, необходимо, чтобы сценарий переводил названия животных с английского языка на русский (листинг 11.13).
Листинг 11.13. Пример работы оператора switch
Ртот РєРѕРґ позволяет получить перевод названия РѕРґРЅРѕРіРѕ РёР· трех животных (СЂРёСЃ.В 11.13).
Рис. 11.13. Пример работы оператора switch
Обратите внимание на оператор break, который позволяет закончить работу оператора switch, так как иначе будет выполняться оставшийся код в операторе switch.
Операторы цикла
Для многократного выполнения кода используют операторы цикла. Кроме того, циклы предоставляют удобные средства для манипулирования массивами.
Цикл for
Оператор for служит для создания цикла. Он имеет следующий синтаксис:
for (выражение инициализации; выражение условия; выражение цикла)
{
операторы
}
Выражение инициализации обычно служит для задания начального значения счетчика цикла. Выражение условия позволяет прекратить выполнять цикл, когда условие перестанет выполняться, то есть примет значение false. Выражение цикла обычно осуществляет инкремент или декремент счетчика цикла. Любое из этих выражений может быть пропущено, но соответствующая точка с запятой должна стоять.
В листинге 11.14 представлен код, позволяющий найти факториал числа – n!=1*2*3*..*n.
Листинг 11.14. Факториал с помощью оператора for
В этом коде организуется цикл от 1 до x, при этом для простоты введенное значение не проверяется на допустимость, поэтому можно, например, получить значение Infinity (бесконечность) при большом значении x.
Цикл while
Оператор while сходен с оператором for, но он не производит инициализацию и инкремент счетчика в своем объявлении. Синтаксис этого оператора следующий:
while (выражение условия)
{
операторы
}
Если выражение условия в цикле while сразу ложно, то операторы не выполнятся ни разу.
В листинге 11.15 представлен код, позволяющий найти факториал с помощью цикла while.
Листинг 11.15. Факториал с помощью оператора while
Цикл do..while
Оператор do..while практически идентичен оператору while, но, поскольку в нем проверка условия осуществляется в конце, он гарантирует выполнение операторов по крайней мере один раз:
do
{
операторы
} while (выражение условия)
В листинге 11.16 представлен код, позволяющий найти факториал с помощью цикла do..while.
Листинг 11.16. Факториал с помощью оператора do..while
Цикл for..in
С помощью конструкции for..in можно выполнить операторы почти для каждого свойства объекта. Синтаксис этого оператора:
for (свойство in объект)
{
операторы
}
Например, с помощью данного оператора можно произвести инкремент всех элементов массива (листинг 11.17).
Листинг 11.17. Пример использования оператора for..in
В ходе выполнения этого кода все элементы массива a увеличат свое значение на единицу (рис. 11.14).
Р РёСЃ.В 11.14. Рнкремент элементов массива
Обратите внимание, что в цикле for..in не определяется свойство массива length.
Операторы break и continue
РРЅРѕРіРґР° РІ С…РѕРґРµ выполнения цикла возникает необходимость прервать весь цикл или РѕРґРЅСѓ его итерацию. Для этой цели служат операторы break Рё continue. Оператор break полностью прекращает выполнение цикла Рё передает управление операторам, следующим Р·Р° циклом. Оператор continue прерывает текущее выполнение цикла Рё переходит Рє выполнению следующего шага цикла. Различие РІ работе этих операторов продемонстрировано РІ листинге 11.18.
Листинг 11.18. Пример использования операторов выхода из цикла
Данный код позволяет определить частное от введенного пользователем числа и элементов массива a. При этом в числе элементов этого массива могут быть нули, тогда необходимо в элемент массива с результатом b ввести прочерк (—) (рис. 11.15).
Рис. 11.15. Пример использования операторов выхода из цикла
Р’ вышеприведенном РєРѕРґРµ также демонстрируется возможность вложения РѕРґРЅРѕРіРѕ цикла РІ РґСЂСѓРіРѕР№. РР· цикла while возможен выход, только если ввести нуль (значение РїРѕ умолчанию). Цикл for РІРѕ время исполнения РёРЅРѕРіРґР° прерывается, если элемент массива a равен нулю, чтобы избежать деления РЅР° ноль.
11.5. Функции и события
До сих пор сценарии представляли собой простой код, сразу полностью выполняющийся. Однако часто требуется исполнение кода в какой-то момент или многократное исполнение одного и того же кода. В этом помогут функции и события.
Функции
Функция – это набор команд, объединенных под общим именем для выполнения некоторой задачи. Синтаксис функции имеет следующий вид:
function РмяФункции([аргумент1][,..аргументN])
{
операторы
}
Ключевое слово function объявляет функцию СЃ именем РмяФункции. Функции РјРѕРіСѓС‚ передаваться (РЅРѕ РјРѕРіСѓС‚ Рё РЅРµ передаваться) аргументы, которые перечисляются через запятую РІ скобках СЂСЏРґРѕРј СЃ именем функции. Р’ качестве аргументов РјРѕРіСѓС‚ выступать переменные, значения Рё выражения.
Рспользование функций
Функции можно объявлять в любом месте внутри элемента SCRIPT. Можно даже объявить функцию внутри другой функции, однако в этом случае она будет локальной, то есть будет действовать только внутри родительской функции. Тем не менее рекомендуется объявлять функцию в блоке HEAD до начала выполнения основного кода, иначе она может быть недоступной в момент вызова. В листинге 11.19 представлен пример работы с функциями.
Листинг 11.19. Пример использования функций
При запуске этого кода отображается запрос, на который необходимо ввести 0 или 1. В зависимости от ответа запускается одна из функций: sum() или product(), которые находят сумму или произведение элементов глобального массива a соответственно.
Функции могут возвращать значение. Для этого необходимо использовать оператор возврата return. Вообще этот оператор может встречаться несколько раз в теле функции. Таким образом, функции можно использовать в выражениях (листинг 11.20).
Листинг 11.20. Рспользование значения функции
Функция может объявляться в выражении. Обычно в этом случае функция присваивается переменной, которая затем может использоваться в выражении:
var cube=function(x){return x*x*x}
alert(cube(2)+cube(3));
В данном случае объявляется переменная-функция, вычисляющая куб числа.
Переменное количество аргументов
РРЅРѕРіРґР° РІ процессе создания функции неизвестно, сколько ей передадут аргументов. Р’ этом случае необходимо воспользоваться объектом arguments. Р’СЃРµ аргументы, переданные функции, сохраняются РІ этом объекте Рё РјРѕРіСѓС‚ быть извлечены. Например, для доступа Рє первому аргументу можно использовать следующий РєРѕРґ:
var arg1=arguments[0];
Таким образом, аргументы индексируются, начиная с нуля. Для определения общего количества аргументов, переданных функции, можно использовать свойство length объекта arguments.
Листинг 11.21 демонстрирует возможность обработки переменного количества аргументов.
Листинг 11.21. Пример переменного количества аргументов в функции
Дополнительная информация о функциях
Аргументами функции РјРѕРіСѓС‚ выступать РЅРµ только данные простого типа, РЅРѕ Рё объекты. Однако РїСЂРё передаче функции строки, числа или логической величины РІ функции создается РєРѕРїРёСЏ переданного значения Рё оригинал РЅРµ изменяется, то есть что Р±С‹ РЅРё делали СЃ аргументом внутри функции, после завершения функции эта переменная уничтожается, Р° оригинальная переменная остается прежней. Рначе РїСЂРѕРёСЃС…РѕРґРёС‚ РїСЂРё передаче объекта. Р’ этом случае РєРѕРїРёСЏ объекта РЅРµ создается, Р° передается ссылка РЅР° данный объект. Если Р±С‹ происходило иначе, то терялось Р±С‹ РјРЅРѕРіРѕ времени Рё памяти РЅР° создание дубликатов. Представьте, сколько потребовалось Р±С‹ времени РЅР° передачу массива РёР· 10 000 элементов, РєРѕРіРґР° фактически можно обойтись передачей РѕРґРЅРѕРіРѕ значения – ссылки РЅР° этот массив. Однако программист должен помнить, что работает РІ функции СЃ оригинальным объектом.
Функции могут быть рекурсивными, то есть прямо или косвенно вызывать сами себя. Если в теле функции явно используется вызов этой же функции, то имеет место прямая рекурсия. Если же функция содержит обращение к другой функции, содержащей прямой или косвенный вызов первой функции, то данная функция является косвенно рекурсивной. Классический пример – функция для вычисления факториала неотрицательного целого числа (листинг 11.22).
Листинг 11.22. Пример рекурсивной функции
Для отрицательного числа факториала не существует. В этом случае возвращается null. Для нулевого значения функция возвращает 1, так как 0!=1. В противном случае вызывается та же функция с декрементом параметра и результат умножается на текущее значение параметра. Вызов функции прерывается при вызове fact (0) (рис. 11.16).
Рис. 11.16. Пример рекурсивной функции
Знакомство с событиями
Очень часто язык JavaScript применяется для реагирования на события, которые могут быть вызваны пользователем или браузером. К событиям относятся открытие новой страницы, перемещение указателя мыши, щелчок кнопкой мыши и т. д. Каждое событие имеет соответствующий обработчик, который автоматически реагирует на возникшее событие.
Так, событие onLoad РїСЂРѕРёСЃС…РѕРґРёС‚ после загрузки какого-либо элемента, например веб-страницы. Рспользование обработчика этого события позволяет выполнять JavaScript-РєРѕРґ сразу после полной загрузки документа.
Одним из часто используемых событий является щелчок кнопкой мыши на объекте. При его возникновении обработчик события onClick объекта выполняет код JavaScript (листинг 11.23).
Листинг 11.23. Пример обработчиков событий
Пример обработчиков событий
onClick="alert('Еще одна ссылка')">Ссылка 1
РР· данного РєРѕРґР° РІРёРґРЅРѕ, что обработчик события может быть вызовом функции. Однако может Рё непосредственно указываться JavaScript-РєРѕРґ. Р’ данном случае РѕР±Р° обработчика вызывают метод alert() (СЂРёСЃ.В 11.17).
Рис. 11.17. Пример обработчиков событий
11.6. Встроенные объекты JavaScript
Объекты JavaScript объединяют в себе переменные, именуемые свойствами, и функции, управляющие этими свойствами, именуемые методами. Кроме того, они могут реагировать на события. Пользователь может создавать свои объекты, но JavaScript содержит ряд базовых объектов.
• Global – набор высокоуровневых свойств и методов, у которых нет родительского объекта.
• String – позволяет форматировать и изменять текстовые строки.
• Number – дает возможность обрабатывать числа.
• Boolean – позволяет создавать логические величины.
• Array – дает возможность создавать и управлять массивами.
• Function – позволяет создать функцию.
• Date – дает возможность работать с временем и датой.
• Math – предоставляет некоторые математические функции и константы.
• RegExp – позволяет выполнять функции регулярных выражений для заданных строк.
• Object – является прототипом для всех объектов.
Объект Global
Ртот объект содержит несколько методов Рё свойств, которые РЅРµ принадлежат РЅРё РѕРґРЅРѕРјСѓ объекту (табл. 11.12 Рё 11.13). Для удобства РёС… объединили РІ объект Global.
Таблица 11.12. Свойства объекта Global
Таблица 11.13. Методы объекта Global
Для доступа к методам и функциям этого объекта родительский объект не указывается:
flag=isFinite(x/y)
Объект String
Объект String предоставляет средства для форматирования и выделения части строк. Для этой цели он содержит обширный перечень методов (табл. 11.14 и 11.15).
Таблица 11.14. Свойства объекта String
Таблица 11.15. Методы объекта String
Рассмотрим использование методов объекта String:
MyText="Я люблю HTML";
MyText=MyText.substring(0,8)+"JavaScript";
В результате строка MyText примет значение «Я люблю JavaScript».
Объект Number
Объект Number обычно применяется для доступа к некоторым постоянным значениям, например к отрицательной бесконечности. Свойства и методы этого объекта указаны в табл. 11.16 и 11.17.
Таблица 11.16. Свойства объекта Number
Таблица 11.17. Методы объекта Number
Объект Boolean
Объект Boolean обычно используется для преобразования объекта РІ логическое значение. Ртот объект имеет ограниченное количество методов Рё свойств (табл. 11.18).
Таблица 11.18. Методы и свойства объекта Boolean
Объект Array
С массивами вы уже познакомились в данной главе, однако массивы – это объекты, которые имеют свои свойства и методы, облегчающие работу программисту (табл. 11.19 и 11.20).
Таблица 11.19. Свойства объекта Array
Таблица 11.20. Методы объекта Array
Объект Function
РЎ помощью объекта Function можно манипулировать функцией как объектом. Ртот объект содержит СЂСЏРґ специфичных методов Рё свойств (табл. 11.21 Рё 11.22).
Таблица 11.21. Свойства объекта Function
Таблица 11.22. Методы объекта Function
Синтаксис определения объекта Function выглядит следующим образом:
РмяОбъектаФункции = new Function ([аргумент1, аргумент2,.. аргументN],
телоФункции);
Например,
sumFunc = new Function ("a","b","return(a+b)");
alert(sumFunc(5,4));
Объект Date
Объект Date предоставляет значительное количество свойств и методов, связанных с датами и временем (табл. 11.23 и 11.24). В качестве базовой даты в JavaScript принято 1 января 1970 года. Язык JavaScript имеет доступ только к времени и дате на клиентской машине.
Таблица 11.23. Свойства объекта Date
Таблица 11.24. Методы объекта Date
Конструктор этого объекта принимает значение даты в числовом или строковом формате:
РмяОбъектаДаты = new Date();
РмяОбъектаДаты = new Date(миллисекунды);
РмяОбъектаДаты = new Date("месяц РґРґ, РіРіРіРі чч:РјРј:СЃСЃ");
РмяОбъектаДаты = new Date(РіРѕРґ, месяц, день [, час, минуты, секунды, миллисекунды]);
где значение определяется следующим образом:
• миллисекунды – целое число, определяющее количество миллисекунд, прошедших с 0 часов 0 минут 0 секунд 1 января 1970 года по Гринвичу;
• месяц, дд, гггг, чч, мм, сс – месяц, день, год, час, минуты и секунды соответственно;
• год, месяц, день, час, минуты, секунды, миллисекунды – целые числа, определяющие соответствующие величины.
Если параметры не указаны, то объект инициализируется текущей датой и временем.
Например, чтобы узнать текущий день недели, можно воспользоваться следующим кодом:
MyDate=new Date();
alert(MyDate.getDay());
Ртот РєРѕРґ отобразит число РѕС‚ 0 РґРѕ 6, соответствующее РґРЅСЋ недели. Например, 0 соответствует воскресенью.
Объект Math
Для математических вычислений JavaScript поддерживает объект Math, который содержит ряд математических констант и функций (табл. 11.25 и 11.26).
Таблица 11.25. Свойства объекта Math
Таблица 11.26. Методы объекта Math
Объект RegExp
Регулярные выражения – это шаблоны для поиска определенных комбинаций символов в строках. В данной книге мы не будем рассматривать регулярные выражения, но список методов и свойств объекта RegExp, позволяющего создавать регулярные выражения, можно найти в табл. 11.27 и 11.28.
Таблица 11.27. Свойства объекта RegExp
Таблица 11.28. Методы объекта RegExp
Объект Object
Все объекты в JavaScript – и встроенные, и пользовательские – наследуются от объекта Object, то есть его методы и свойства (табл. 11.29 и 11.30) присутствуют в каждом объекте, но, как правило, их переопределяют.
Таблица 11.29. Свойства объекта Object
Таблица 11.30. Методы объекта Object
Резюме
Р’ этой главе дано общее описание фундаментальных составляющих языка JavaScript: переменных, выражений, операций, объектов, функций Рё событий. Рменно эти знания являются основополагающими, без РЅРёС… невозможно владение языком сценариев. РљСЂРѕРјРµ того, РІ настоящей главе приведены данные Рѕ свойствах Рё методах всех встроенных объектов JavaScript. Рту информацию необязательно запоминать, РЅРѕ можно использовать как справочную, так как начинающему программисту РѕРЅР° нужна РІ ограниченном объеме. Данная глава охватывает, возможно, слишком РјРЅРѕРіРѕ понятий Рё может показаться вам сложной. Можете вернуться Рє ней позднее, чтобы закрепить новые знания.