Хелпикс

Главная

Контакты

Случайная статья





Внимание!



Регистр символов в именах переменных, а также функций, классов (на будущее) в JavaScript имеет значение. Это значит, что, например, val и Val – это различные переменные.

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

var v1, somevar = «asd»;

Как видно, в одной строке можно объявить сразу несколько переменных. При объявлении переменных их можно инициализировать (оператор = используется для присвоения значений переменным). Неинициализированные переменные содержат значение undefined (в данном случае это переменная v1). Переменные могут также содержать специальное значение null, означающее, что в переменной нет данных. Кроме того, можно использовать специальное значение NaN (Not a Number), сигнализирующее о том, что в переменной содержится не число.

Если необходимо определить тип выражения или тип значения, которое хранится в переменной, то можно использовать оператор typeof(выражение). Этот оператор возвращает строковые значения: number (для численных выражений или значения NaN), string (для строк), object (для значения null и ссылок на объекты).

12. 4. Простые и составные операторы

Простыми операторами называются единичные конструкции, выполняющие какое‑ нибудь действие, например вычисление значения одного выражения, присвоение значения, вызов функции и др.

В отличие от простых операторов, составной оператор может содержать в себе любое количество простых или вложенных операторов. Составной оператор задается (часто называемый блоком) при помощи скобок {}. Внутри этих скобок помещаются простые или вложенные составные операторы. Составные операторы используются, если нужно поместить несколько операторов, но ожидается присутствие только одного. В качестве примера рассмотрим оператор if (то, как работает этот оператор, описано далее). В теле оператора if ожидается наличие только одного оператора, выполняющего какое‑ либо действие, например:

if (a == 1) a++;

Что же делать, если нужно выполнить последовательность более чем из одного оператора? Ответ: применить составной оператор так, как это сделано ниже:

if (a == 1) {

a++;

//Другие действия...

}

12. 5. Операторы языка JavaScript

Арифметические операторы. Инкремент и декремент

В языке JavaScript присутствуют стандартные для языков программирования арифметические операторы, позволяющие производить вычисления с численными и строковыми значениями (для строк только оператор +).

К арифметическим операторам JavaScript относятся: + (сложение), – (вычитание), * (умножение), / (деление). В дополнение к ним присутствует оператор взятия остатка от деления %. Все указанные операторы являются бинарными (в том смысле, что принимают два значения и возвращают одно). Кроме указанных операторов, существует еще и унарный оператор –, инвертирующий значение аргумента (например –123, –val).

В JavaScript предусмотрена также удобная возможность записи выражений вида i = i + 1, i = i – 1, i = i * j и пр., где i – произвольная переменная, а j – произвольное выражение. Первые два выражения сокращенно записываются как инкремент и декремент: i++ и i–. Третье выражение и подобные ему можно сократить, применив следующие операторы:

• оператор –=, то есть i = i – j эквивалентно i –= j;

• оператор +=, то есть i = i + j эквивалентно i += j;

• оператор *=, то есть i = i * j эквивалентно i *= j;

• оператор /=, то есть i = i / j эквивалентно i /= j;

• оператор %=, то есть i = i % j эквивалентно i %= j.

Кроме того, предусмотрены соответствующие операторы & =, ^=, |= для двоичных операторов и < < =, > > =, > > > = для операторов сдвига.

Логические операторы и операторы сравнения

И логические операторы, и операторы сравнения возвращают результат – логическое значение true или false. Однако логические операторы принимают аргументы логического типа, в то время как операторы сравнения сравнивают значения произвольного типа. И логические операторы, и операторы сравнения языка JavaScript приведены в табл. 12. 3.

Таблица 12. 3. Логические операторы и операторы сравнения


Двоичные операторы

Двоичные операторы применяют при необходимости осуществления операций над численными (обычно целыми) значениями на уровне их битового представления. Здесь не рассматривается подробно, как представлены числа в памяти компьютера, а описываются только операторы.

Итак, двоичных операторов в JavaScript семь. Эти операторы перечислены в табл. 12. 4.

Таблица 12. 4. Двоичные операторы JavaScript

Приоритет операторов

Все операторы, которые могут быть использованы в выражениях, имеют свой приоритет, который учитывается при определении очередности вычисления значений подвыражений. Ниже приведен список операторов согласно их приоритету (от наивысшего к самому низкому).

1. ++, –, – (унарный), ~, !, typeof.

2. *, /, %.

3. +, -.

4. < <, > >, > > >.

5. >, > =, <, < =.

6. ==, ! =, ===.

7. &.

8. ^.

9. |.

10. & &.

11. ||.

12. =, +=, –=, *=, /=, %=, & =, |=, ^=.

Несмотря на приоритет операторов, очередность вычисления подвыражений может быть изменена использованием скобок () любой вложенности. Выражение, заключенное в скобки, всегда вычисляется раньше других на том же уровне вложенности.

Условные операторы

При программировании на JavaScript можно использовать три условных оператора: if, select и оператор? (именно вопросительный знак). Последний из операторов является самым простым, поэтому рассмотрим его в первую очередь.

Оператор? используется как сокращенная версия оператора if при необходимости рассчитать значение одного из двух выражений в зависимости от истинности или ложности условия. Оператор имеет следующий формат:

условие? выражение1: выражение2

Здесь условие – логическое выражение (результат true или false). Выражение1 вычисляется в случае истинности выражения условие, иначе вычисляется значение выражения выражение2. Оператор? возвращает значение (подобно любому другому оператору, например = или *), равное значению вычисленного выражения. Ниже приведено несколько примеров использования оператора? (для большей наглядности выражения часто заключают в скобки):

a = (b > 3)? b: 3; //Значение переменной a будет не меньше 3

a = (text == " continue" )? (a+=2): a;

Следующим рассмотрим оператор if, который позволяет выбрать выполнение одной из двух последовательностей операторов в зависимости от истинности или ложности выражения‑ условия. Оператор if имеет следующий формат:

if (условие) оператор1

else оператор2

Если значение выражения условие равно true, то выполняется оператор1 (это может быть как простой, так и составной оператор), в противном случае выполняется оператор2 (также или простой, или составной оператор). Часть else оператор2 является необязательной. Ниже приведено несколько примеров использования оператора if:

if (b! = 0) a /= b; //Проверяется отсутствие деления на ноль

else {

//Какие-то действия по информированию (в данном случае ничего)

}

if (a > 12)

if (a< 25); //Действия при 12 < a < 25

else; //Действия при a > 25

В приведенном примере проиллюстрирована одна проблема, с которой часто сталкиваются начинающие программисты на C‑ подобных языках. Здесь специально проставлены отступы так, чтобы проиллюстрировать тот факт, что ключевое слово else относится к последнему по порядку оператору if. Если бы использовался блок, то принадлежность else была бы очевидной:

if (a > 12){

if (a< 25); //Действия при 12 < a < 25

else; //Действия при a > 25

}

Напоследок осталось рассмотреть последний из условных операторов – оператор множественного выбора switch. Он позволяет выбрать одну из многих альтернатив в зависимости от значения заданного выражения. Формат оператора приведен ниже:

switch (выражение){

case выражение1:

операторы1

case выражение2:

операторы2

...

default:

операторы_по_умолчанию

}

Оператор switch работает следующим образом. Сначала вычисляется значение выражения выражение. Далее это значение сравнивается с выражениями при каждом ключевом слове case сверху вниз. Если, например, значение выражение совпало со значением выражение2, то выполняется последовательность операторов операторы2. Выполнение продолжается до тех пор, пока не будет встречен оператор break либо выполнение не дойдет до конца тела оператора switch (закрывающая скобка }). Если перед следующим ключевым словом case отсутствует оператор break, то выполнится последовательность операторов операторы3 и т. д. Ключевое слово default используется для того, чтобы задать последовательность операторов, которые должны выполниться при несовпадении значения выражение со всеми выражениями при всех ключевых словах case. Для иллюстрации сказанного приводится пример использования оператора switch:

switch (var){

case 1:

//Операторы выполнятся при var == 1

break;

case 2:

//Операторы выполнятся при var == 2

case 3:

//Операторы выполнятся при var == 2 или var == 3

break;

case 4:

//Операторы выполнятся при var == 4

default:

//Операторы выполнятся при var! = 1 & & var! = 2 & & var! = 3

}

Циклы

Язык JavaScript поддерживает три вида циклов: for, while и do-while. Начнем с более простых циклов while и do-while. Цикл while позволяет выполнять нужные действия, пока истинно выражение‑ условие. Формат оператора while следующий:

while (условие) оператор

Здесь условие – логическое выражение (аналогично операторам if и? ), а оператор – простой или составной оператор, выполняемый при каждой итерации цикла. Пример использования цикла while:

var i = 0;

while (i< 10){

//Какие-то действия...

i++; //Не забываем увеличить итератор, чтобы случайно

//не организовать бесконечный цикл

}

Следующий оператор цикла do-while имеет следующий формат:

do оператор while (условие)

Этот оператор цикла аналогичен оператору while с тем лишь отличием, что условие в цикле do-while проверяется после выполнения каждой итерации. Это значит, что оператор выполнится как минимум один раз. Предыдущий пример можно записать с использованием оператора do-while следующим образом:

var i = 0;

do{

//Какие-то действия...

i++; //Не забываем увеличить итератор, чтобы случайно

//не организовать бесконечный цикл

}while (i< 10);

Теперь рассмотрим оставленный напоследок цикл for. Оператор for имеет следующий формат:

for (выражение1; условие; выражение2) оператор

Значение выражения выражение1 рассчитывается перед первой итерацией цикла. Обычно это инициализация счетчика или другой переменной, нужной в цикле. Операторы в теле цикла (оператор) выполняются до тех пор, пока истинно значение выражения условие. Перед второй и последующей итерациями вычисляется значение выражения выражение2 (обычно это выражение по изменению переменной цикла). Для демонстрации использования цикла for ниже приводится пример (аналог примеров для циклов while и do-while):

var i;

for(i=0; i< 10; i++){

//Какие-то действия...

}

Операторы break и continue

Оператор break, помимо прерывания выполнения последовательности операторов внутри оператора switch, используется для прерывания итерации циклов. В следующем примере выполнение цикла for прерывается как раз с помощью оператора break:

var i;

for (i=0; i< 10; i++){

//Действия...

if (i == 5) break;

}

Если в теле цикла встречается оператор continue, то остальные операторы игнорируются, а выполнение переходит на проверку условия цикла. Например, в следующем цикле суммируются значения от 1 до 10 (с помощью оператора continue игнорируются значения 5 и 7):

var i, sum = 0;

for (i=0; i< 10; i++){

if (i == 5 || i == 7) continue;

sum += i;

}

Оператор запятая

Оператор полезен в тех случаях, когда нужно одновременно вычислить значение нескольких выражений в том месте, где допускается запись только одного. Рассмотрим этот случай на примере оператора for. Пусть нужно, чтобы в цикле было два итератора, но очень не хочется писать увеличение (уменьшение) одного из них в теле цикла. С использованием оператора, (запятая) можно разрешить проблему следующим образом:

var i, j;

for (i=0, j=100; i< j; i++, j–){

//Действия...

}

Выражения, разделенные оператором, (запятая), вычисляются слева направо. При этом возвращаемым значением будет значение самого левого выражения. В следующем примере значение переменной res будет равным 3, а не 6:

var res, val = 2;

res = val+=1, val=5;

Из этого примера можно подчеркнуть одну особенность всех операторов присваивания языка JavaScript: они тоже возвращают значение. Корректными являются конструкции вида:

a = 1 + (b = c = d = 25);

Здесь значением переменной a будет 26, а остальных переменных – 25. Все сказанное об операторе, (запятая) не касается использования этого оператора при вызове функций.

12. 6. Функции

Функции применяются в тех случаях, когда недостаточно программы, представляющей собой простую последовательность операторов, выполняющуюся один раз. В этом случае применение функций позволяет сгруппировать операторы и выполнять их произвольное количество раз (вызывая функцию из любого места программы). Упрощенно о функции можно сказать, что это именованная последовательность операторов.

Пользовательские функции

Пользовательская функция – любая функция, созданная программистом (а не встроенная в интерпретатор). Для создания пользовательских функций применяется следующая конструкция:

function имя_функции(параметр1, параметр2, ... ){

//Операторы тела функции

return выражение

}

Здесь имя_функции – имя, идентификатор функции. На него распространяются те же ограничения, что и на имя любой переменной. В скобках задается список формальных параметров функции (она может и не иметь параметров). Каждый элемент этого списка – идентификатор переменной. Переменные с указанными в списке идентификаторами могут использоваться в функции так, как будто они были объявлены с использованием var (дополнительно эти переменные инициализируются значениями, переданными в функцию). Для возврата результата выполнения функции используется оператор return.

Рассмотрим пример функции, принимающей два значения и возвращающей сумму переданных ей значений:

function sum (v1, v2){

//Вычисляем сумму двух значений

return v1 + v2;

}

Для вызова этой функции в любом месте программы, а также в теле другой функции должна использоваться следующая запись:

sum(выражение1, выражение2)

Значения двух указанных выражений и будут переданы в функцию в качестве значений переменных v1 и v2. Если результат, возвращаемый функцией, используется, то в этом случае вызов функции записывают в правой части операторов присваивания либо как аргумент оператора в выражении, например:

summa = sum(3, 4); //В переменную summa заносится 7

summa = sum(3, sum(4, 5)); //Суммируются три значения

Встроенные функции JavaScript

Программист на JavaScript может использовать некоторые встроенные в интерпретатор функции, позволяющие значительно упростить некоторые аспекты программирования, связанные с преобразованиями строковых значений, вычислениями значений выражений. Эти функции приведены в табл. 12. 5.

Таблица 12. 5. Встроенные функции JavaScript

Глобальные и локальные переменные

При рассмотрении функций нельзя обойти вниманием такой вопрос, как область видимости переменных. Итак, переменные, объявленные вне функции, являются глобальными переменными. К ним можно получить доступ из любого места программы.

Переменные можно объявлять и внутри функций с использованием все того же ключевого слова var. Такие переменные являются локальными, и доступ к ним можно получить только внутри той функции, в которой они объявлены. Объявление любой локальной переменной может находиться в любом месте функции. При этом переменную, объявленную ниже в тексте программы, можно использовать выше, потому что интерпретатор при входе в функцию создает сразу все объявленные в ней переменные. В месте же объявления переменных происходит только их инициализация. Следующий пример является абсолютно корректным:

var j;

i = 1;

j = i;

var i = 2;

Рассмотрим также, что происходит, если имеет место такой случай:

var i = 1; //Глобальная переменная

function f(){

var i = 2; //Локальная переменная

return i;

}

В данном случае функция возвратит значение 2, то есть в операторе return используется значение локальной переменной.

Ссылки на функции

Кроме значений описанных ранее типов, переменным можно присваивать имена функций. После такого присвоения функцию можно вызвать, используя в качестве имени функции имя переменной, как в приведенном ниже примере:

var pfun = sum; //Присваиваем ссылку на функцию

var res = pfun(1, 3); //Вызываем функцию sum

function sum(arg1, arg2){

return arg1+arg2;

}

Это может оказаться полезным во многих случаях. Например, в функциях сортировки массивов в число параметров функции сортировки часто включают параметр, предназначенный для передачи ссылки на функцию, сравнивающую элементы массива и возвращающую строго определенные значения (см. описание метода sort класса Array далее в тексте главы).

Кстати, оператор typeof возвращает значение function, если его параметром является имя функции или переменная, которой ранее присвоено имя функции.

12. 7. Массивы

Использование массивов очень удобно, если нужно хранить большое количество однотипных значений. Массив – это список значений, хранящихся под одним именем. Доступ к каждому элементу массива осуществляется по номеру соответствующего элемента. Нумерация элементов массива в JavaScript начинается с нуля.

Массивы создаются в два этапа: объявляется переменная для хранения массива, после чего производится инициализация массива. Например:

var arr;

arr = [1, 2, 3, 4, 5];

или

var arr = [1, 2, 3, 4, 5];

Результатом выполнения приведенного фрагмента кода является создание массива, состоящего из пяти элементов. Доступ к элементам массива осуществляется с помощью оператора []. Операция получения значения третьего элемента массива выглядит следующим образом:

val = arr[2];

Конструкцию вида имя_массива[номер] можно использовать и в выражениях аналогично обычным переменным. Значения элементов массива можно сразу не указывать, то есть можно объявить пустой массив:

var arr;

arr = [];

Созданный массив при этом не содержит элементов. Для заполнения массива можно также использовать оператор []. Во время присвоения значений элементам массива проявляется следующая особенность: массив автоматически расширяется, если номер элемента, которому присваивается значение, превосходит номер последнего элемента в массиве. В следующем примере в результате выполнения присваивания массив будет содержать пять элементов, причем четыре первых из них будут иметь значение undefined:

var arr;

arr = [];

arr[4] = 5;

Для создания многомерного массива нужно элементам уже объявленного массива также присвоить массивы. Создание пустого двумерного массива (четыре строки с неопределенным количеством элементов) может выглядеть следующим образом:

var arr;

arr = [[], [], [], []];

Для обращения к элементам многомерного массива используется тот же оператор [], например:

arr[0][1] = 124;

arr[2][1] = arr[0][1];

Массивы в JavaScript являются объектами (оператор typeof для переменных‑ массивов возвращает значение object). К тому же отсутствуют ограничения относительно формы, например, двумерных массивов: можно создавать как прямоугольные, так и треугольные или другие массивы произвольной формы. В ряде случаев это весьма полезно, но иногда может и запутать.

Размер массива можно получить с помощью свойства length этого объекта. Что такое свойство объекта и как его использовать, рассказано в следующем разделе.

12. 8. Работа с объектами

Главная цель этого раздела – познакомить вас с приемами программирования на JavaScript, которые будут необходимы для организации взаимодействия с браузером и без которых сценарий в HTML‑ документе совершенно бесполезен.

Понятие объекта. Свойства и методы

С точки зрения программиста, объект – это сложный тип данных, содержащий совокупность значений переменных (свойств) и функций для их обработки (методов). Все объекты одного и того же типа (с одним и тем же набором свойств и методов) представляют собой конкретные экземпляры одного класса.

Свойства объектов можно использовать в программе как обычные переменные, то есть можно присваивать и получать их значения. Методы объектов вызываются и возвращают значения так же, как и обычные встроенные или пользовательские функции.

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

Объекты перед использованием необходимо создавать. Создание объектов осуществляется при помощи оператора new. Например, пусть есть класс point, содержащий свойства x и y, хранящие координату точки на плоскости, и метод distance(x, y), который позволяет рассчитать расстояние от точки с нужными координатами до точки, описываемой объектом. Тогда создание и использование объекта класса point можно проиллюстрировать следующим примером:

var p = new point; //Создание объекта класса point

p. x = p. y = 10; //Присвоение значений свойствам

var dist = distance(20, 0); //Вызов метода distance

В приведенном примере создавался пустой объект в том смысле, что изначально неизвестно, какое значение имеют свойства x и y только что созданного объекта. Если класс point поддерживает инициализацию при создании объектов, то присвоить начальные значения атрибутам можно следующим образом:

var p = new point(10, 10);



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.