Глава 5 Операторы
JavaScript поддерживает компактный набор операторов, которые могут использоваться для создания интерактивных Web-страниц. В данной главе дан обзор этих операторов.
В этой главе имеются следующие разделы, предоставляющие краткий обзор каждого оператора:
- Условные Операторы: if...else и switch
- Операторы Циклов: for, while, do...while, label, break и continue (label сам по себе не является оператором цикла, но часто используется с указанными операторами)
- Операторы Манипуляции Объектами: for...in и with
- Операторы Обработки Исключений: try...catch и throw
Любое выражение также является оператором. См. в Главе 3 в разделе «Выражения и Операции» полную информацию об операциях.
Используйте символ «точка с запятой» (;) для разделения операторов в коде JavaScript.
См. в книге Ядро JavaScript. Справочник. детали об операторах из этой главы.
Блок Операторов
Блок операторов используется для группирования операторов. Блок ограничен фигурными скобками:
{statement1 statement2 . . .statementn}
Условные Операторы
Условный оператор является набором команд, которые выполняются, если специфицированное условие –
true. JavaScript поддерживает два условных оператора:
if...else и
switch.
Оператор if...else
Этот оператор используется для выполнения определённых операторов, если логическое условие
true; используйте необязательный блок
else для выполнения других операторов, если условие
false. Оператор if выглядит так:
if (condition) {
statements1
}
[else {
statements2
} ]
Условие может быть любым выражением JavaScript, вычисляемым в
true или
false. Выполняемые операторы могут быть любыми операторами JavaScript, включая вложенные операторы
if. Если Вам нужно выполнить более одного оператора после операторов
if или
else, вы обязаны заключить эти выполняемые операторы в фигурные скобки {}.
Вы не должны использовать простые присвоения в условном операторе. Например, НЕ используйте такой код:
Если Вам нужно использовать присвоение в условном операторе, введите дополнительные скобки вокруг операции присвоения. Например,
if( (x = y) ).
Не путайте примитивные
Boolean-значения
true и
false со значениями
true и
false объекта
Boolean. Любой объект, чьё значение не
undefined,
null,
zero, **NaN** или пустая строка, включая объект
Boolean со значением
false, вычисляется в
true, когда передаётся условному оператору. Например:
var b = new Boolean(false);
if (b)
Пример.
В этом примере функция
checkData возвращает
true, если количество символов в
Text-объекте равно трём; иначе, выводит предупреждение и возвращает
false.
function checkData () {
if (document.form1.threeChar.value.length == 3) {
return true
} else {
alert("Enter exactly three characters. " +
document.form1.threeChar.value + " is not valid.")
return false
}
}
Оператор switch
Оператор
switch позволяет программе вычислять выражение и пытается сопоставить значение выражения значению в метке case. Если совпадение найдено, программа выполняет ассоциированный оператор. Оператор
switch выглядит так:
switch (expression){
case label :
statement;
break;
case label :
statement;
break;
...
default : statement;
}
Программа сначала ищет
label, совпадающий со значением
expression, а затем выполняет ассоциированный statement/оператор. Если совпадающий
label не найден, программа ищет необязательный
default statement/оператор по умолчанию и, если он найден, выполняет ассоциированный оператор. Если
default statement не найден, программа продолжает выполнять оператор, следующий после конца оператора
switch.
Необязательный оператор
break, ассоциированный с меткой
case label, гарантирует, что программа прервёт выполнение оператора
switch, как только будет выполнен оператор найденного совпадения, и продолжит выполнение с оператора, идущего после оператора
switch. Если
break отсутствует, программа продолжает выполнение следующего оператора внутри оператора
switch.
Пример.
Здесь, если
expr вычисляется в
Bananas, программа находит совпадение с case
Bananas и выполняет ассоциированный оператор. Если обнаружен
break, программа прерывает
switch и выполняет оператор после блока оператора
switch. Если
break отсутствует, оператор в
case Cherries также будет выполнен.
switch (expr) {
case "Oranges" :
document.write("Oranges are $0.59 a pound.<BR>");
break;
case "Apples" :
document.write("Apples are $0.32 a pound.<BR>");
break;
case "Bananas" :
document.write("Bananas are $0.48 a pound.<BR>");
break;
case "Cherries" :
document.write("Cherries are $3.00 a pound.<BR>");
break;
default :
document.write("Sorry, we are out of " + i + ".<BR>");
}
document.write("Is there anything else you'd like?<BR>");
Операторы Циклов
Цикл/
loop это набор операторов, который выполняется несколько раз, пока выполняется специфицированное условие. JavaScript поддерживает циклические операторы
for,
do...while и
while, а также
label (
label сам по себе не является оператором цикла, но часто используется с указанными операторами). Кроме того, вы можете использовать операторы
break и
continue внутри операторов циклов.
Ещё один оператор цикла,
for...in, также выполняет свои операторы циклически, но используется для работы с объектами. См. Операторы Манипуляции Объектами.
Оператор for
Цикл
for повторяется до тех пор, пока специфицированное значение
false. Цикл JavaScript
for похож на циклы
for Java и C. Оператор
for выглядит так:
for ([initialExpression]; [condition]; [incrementExpression]) {
statements
}
Когда цикл
for выполняется, происходит следующее:
1. Инициализирующее выражение initialЕxpression, если имеется, выполняется. Это выражение обычно инициализирует один или более счётчиков цикла, и синтаксис разрешает выражения любой сложности. Это выражение также может объявлять переменные.
2. Вычисляется выражение condition/условное. Если значение condition – true, выполняются statements/операторы цикла. Если значение condition – false, цикл for прекращает работу. Если выражение condition полностью отсутствует, принимается, что condition – true.
3. Выполняются statements.
4. Обновляющее выражение incrementExpression, если имеется, выполняется, и управление возвращается к Шагу 2.
Пример.
Эта функция содержит оператор
for, который подсчитывает количество выбранных опций в прокручиваемом списке (объект
Select, позволяющий выбрать несколько позиций). Оператор
for объявляет переменную
i и инициализирует её в нуль. Он проверяет, меньше ли
i количества опций объекта
Select, выполняет оператор
if и инкремент переменной
i на единицу после каждого прохода цикла.
<SCRIPT>
function howMany(selectObject) {
var numberSelected=0;
for (var i=0; i < selectObject.options.length; i++) {
if (selectObject.options[i].selected==true)
numberSelected++;
}
return numberSelected;
}
</SCRIPT>
<FORM NAME="selectForm">
<P><B>Choose some music types, then click the button below:</B>
<BR><SELECT NAME="musicTypes" MULTIPLE>
<OPTION SELECTED> R&B
<OPTION> Jazz
<OPTION> Blues
<OPTION> New Age
<OPTION> Classical
<OPTION> Opera
</SELECT>
<P><INPUT TYPE="button" VALUE="How many are selected?"
onClick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))">
</FORM>
Оператор do...while
Оператор
do...while повторяется, пока специфицированное выражение –
false. Оператор
do...while выглядит так:
do {
statement
} while (condition)
statement выполняется один раз перед проверкой условия/condition. Если
condition – true, оператор выполняется снова. В конце каждого выполнения
condition проверяется. Если
condition – false, выполнение останавливается и управление передаётся оператору после
do...while.
Пример.
В этом примере цикл
do итерируется минимум один раз и повторяет итерации, пока
i меньше
5.
do {
i+=1;
document.write(i);
} while (i<5);
Оператор while
Оператор
while выполняет свои операторы, пока специфицированное condition/условие –
true. Оператор
while выглядит так:
while (condition) {
statements
}
Если
condition становится
false, операторы внутри цикла прекращают выполняться и управление передаётся оператору, следующему после цикла.
Проверка условия/condition происходит до выполнения операторов внутри цикла. Если
condition возвращает
true, операторы выполняются и
condition проверяется снова. Если condition возвращает
false, выполнение цикла прекращается и управление передаётся оператору, идущему после оператора
while.
Пример 1.
Этот цикл
while итерирует, пока
n меньше
3:
n = 0;
x = 0;
while( n < 3 ) {
n ++;
x += n;
}
При каждой итерации цикл увеличивает
n и прибавляет это значение к переменной
x. Следовательно,
x и
n принимают следующие значения:
- После первого прохода: n = 1 и x = 1
- После второго прохода: n = 2 и x = 3
- После третьего прохода: n = 3 и x = 6
После выполнения трёх проходов цикла,
condition n < 3 больше не true, поэтому выполнение цикла прерывается.
Пример 2: Бесконечный цикл.
Убедитесь, что условие цикла когда-нибудь станет
false; иначе цикл никогда не прервётся. Операторы следующего цикла
while выполняются бесконечно, поскольку условие никогда не станет
false:
while (true) {
alert("Hello, world") }
Оператор label
Оператор
label является идентификатором, на который можно ссылаться из любого места программы. Например, вы можете использовать
label для идентификации цикла, а затем использовать операторы
break или
continue для прерывания цикла или продолжения выполнения.
Синтаксис оператора
label выглядит так:
Значением
label может быть любой верный идентификатор JavaScript, не являющийся зарезервированным словом. Оператор/statement, идентифицируемый при помощи
label, может быть любым оператором.
Пример.
В этом примере
label markLoop идентифицирует цикл
while.
markLoop:
while (theMark == true)
doSomething();
}
Оператор break
Используйте оператор
break для прерывания цикла
switch или оператора с меткой
label.
- Если вы используете break без label, он немедленно прерывает ближайший содержащий while, do-while, for или switch и передаёт управление следующему оператору.
- Если вы используете break с label, он прерывает специфицированный помеченный оператор.
Синтаксис оператора
break таков:
Первый вариант прерывает ближайший содержащий цикл или
switch; второй вариант прерывает специфицированный оператор, имеющий метку.
Пример.
Здесь выполняется итерация по элементам массива, пока не будет найден индекс элемента со значением
theValue:
for (i = 0; i < a.length; i++) {
if (a[i] = theValue)
break;
}
Оператор continue
Оператор
continue используется для рестарта операторов
while,
do-while,
for и
label.
- Если вы используете continue без label, он прерывает текущую итерацию ближайшего цикла while, do-while или for и продолжает выполнение этого цикла со следующей итерации. В отличие от оператора break, continue не прерывает выполнение цикла полностью. В цикле while он переходит на condition. В цикле for на increment-expression.
- Если вы используете continue с label, он применяется к оператору цикла, идентифицированному этим label.
Синтаксис оператора
continue таков:
1. continue
2. continue label
Пример 1.
Это пример цикла
while с оператором
continue, который выполняется, если значение
i равно
3. Таким образом,
n получает значения
1, 3, 7 и 12.
i = 0;
n = 0;
while (i < 5) {
i++;
if (i == 3)
continue;
n += i;
}
Пример 2.
Оператор, помеченный как
checkiandj, содержит оператор, помеченный как
checkj. Если обнаружен
continue, программа прерывает текущую итерацию
checkj и начинает следующую итерацию. Каждый раз при обнаружении continue,
checkj начинает итерацию вновь, пока его условие не возвратит
false. Если возвращено
false, выполняется оставшаяся часть оператора
checkiandj и
checkiandj реитерирует, пока его условие не возвратит false. Если возвращается
false, программа продолжает выполняться с оператора, следующего после
checkiandj.
Если continue имеет
label для
checkiandj, программа продолжит выполнение от начала оператора
checkiandj.
checkiandj :
while (i<4) {
document.write(i + "<BR>");
i+=1;
checkj :
while (j>4) {
document.write(j + "<BR>");
j-=1;
if ((j%2)==0)
continue checkj;
document.write(j + " is odd.<BR>");
}
document.write("i = " + i + "<br>");
document.write("j = " + j + "<br>");
}
Операторы Манипуляции Объектами
JavaScript использует операторы
for...in и
with для манипулирования объектами.
Оператор for...in
Оператор
for...in итерирует специфицированную переменную по всем свойствам объекта. Для каждого достигнутого свойства JavaScript выполняет специфицированные операторы. Оператор
for...in выглядит так:
for (variable in object) {
statements }
Пример.
Эта функция принимает в качестве аргумента объект и имя объекта. Затем она итерирует по всем свойствам этого объекта и возвращает строку – список имён свойств и их значений.
function dump_props(obj, obj_name) {
var result = "";
for (var i in obj) {
result += obj_name + "." + i + " = " + obj[i] + "<BR>"
}
result += "<HR>";
return result;
}
Для объекта
car со свойствами
make и
model результат будет таким:
car.make = Ford
car.model = Mustang
Оператор with
Оператор
with устанавливает объект по умолчанию для набора блока операторов. JavaScript просматривает неквалифицированные имена внутри блока операторов и определяет, являются ли имена свойствами объекта по умолчанию. Если неквалифицированное имя является свойством, то это свойство используется в операторе; иначе, используется локальная или глобальная переменная.
Оператор with выглядит так:
with (object){
statements
}
Пример.
Здесь оператор
with специфицирует, что объект
Math является объектом по умолчанию. Операторы после оператора with обращаются к свойству
PI и к методам
cos и
sin без специфицирования объекта. JavaScript принимает объект
Math как объект для этих обращений.
var a, x, y;;
var r=10
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI/2);
}
Примечание:
Использование оператора with может значительно замедлить выполнение программы.
Комментарии
Комментарии обычно разъясняют действия, выполняемые кодом. Комментарии игнорируются интерпретатором. JavaScript поддерживает комментарии в стиле Java и C++:
- Однострочный комментарий с двойным слэшем в начале строки (//).
- Многострочный комментарий с символами /* в начале и с символами */ в конце.
Пример.
Вот пример двух комментариев:
Операторы Обработки Исключений
Вы можете вызывать исключение оператором
throw и обрабатывать его операторами
try...catch.
Оператор
try...catch используется также для обработки исключений Java. См. разделы «Обработка Исключений Java в JavaScript" и «Обработка Исключений JavaScript в Java».
Оператор throw
Оператор
throw используется для вызова исключения. Если вы вызываете исключение, вы специфицируете выражение, содержащее значение исключения:
Следующий код вызывает несколько исключений.
throw "Error2"; throw 42; throw true;
При вызове исключения вы можете специфицировать объект. Затем можно обратиться к свойствам объекта в блоке
catch. Следующий пример создаёт объект
myUserException типа
UserException и использует его в операторе
throw.
function UserException (message) {
this.message=message;
this.name="UserException";
}
myUserException=new UserException("Value too high");
throw myUserException;
Оператор try...catch
Оператор
try...catch помечает блок операторов, пытается их выполнить и специфицирует один или более вариантов ответа при возникновении исключения. Если исключение возникло, оператор
try...catch отлавливает его.
Оператор
try...catch состоит из блока
try, который содержит один или более операторов, и нуль или более блоков
catch, содержащих операторы, которые специфицируют действия при вызове исключения в блоке
try. То есть, если вы хотите выполнить блок
try и он не выполняется, вы передаёте управление в блок
catch. Если любой оператор блока
try (или оператор функции, вызываемой из блока
try) вызывает исключение, управление немедленно передаётся в блок
catch. Если исключение не было вызвано, блок
catch пропускается. Блок
finally выполняется после выполнения блоков
try и
catch, но до выполнения оператора, идущего после блока оператора
try...catch.
В следующем примере используется оператор
try...catch. Вызывается функция, которая запрашивает название месяца из массива, базируясь на значении, передаваемом функции. Если значение не соответствует номеру месяца (
1–12), вызывается исключение со значением
«InvalidMonthNo" и операторы блока
catch устанавливают переменную в
monthName значение
unknown.
function getMonthName (mo) {
mo=mo-1; var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
"Aug","Sep","Oct","Nov","Dec");
if (months[mo] != null) {
return months[mo]
} else {
throw "InvalidMonthNo"
}
}
try {
monthName=getMonthName(myMonth) }
catch (e) {
monthName="unknown"
logMyErrors(e) }
Блок catch
Вы можете использовать единственный блок
catch для обработки всех исключений, которые могут быть сгенерированы в блоке
try, или можете использовать отдельные блоки
catch для обработки определённых типов исключений.
Единственный блок catch
Используйте единственный в данном операторе
try...catch блок
catch (восстанавливающий блок) для выполнения кода обработки ошибок для каждого исключения, вызываемого в блоке try.
Единственный блок
catch имеет следующий синтаксис:
catch (catchID) {
statements
}
Блок
catch специфицирует идентификатор (
catchID в предыдущем синтаксисе), по которому содержится значение, специфицированное оператором
throw; вы можете использовать этот идентификатор для получения информации о вызванном исключении. JavaScript создаёт этот идентификатор при входе в блок
catch; идентификатор существует только в период выполнения блока
catch; после завершения выполнения блока
catch идентификатор больше не доступен.
Например, следующий код вызывает исключение. Если возникает исключение, управление передаётся в блок
catch.
try {
throw "myException" }
catch (e) {
logMyErrors(e) }
Несколько блоков catch
Единственный оператор
try может содержать несколько условных блоков
catch, каждый из которых обрабатывает специфический тип исключения. В этом случае вход в подходящий условный блок
catch выполняется только при вызове исключения, специфицированного для данного блока. Вы можете также по выбору включить отдельный блок
catch для всех неспецифицированных исключений как финальный блок
catch в операторе.
Например, следующая функция вызывает три другие функции (объявленные в другом месте), которые проверяют её аргументы. Если проверяющая функция определяет, что проверяемый компонент неверен, она возвращает 0, заставляя вызывающую функцию вызывать определённое исключение.
function getCustInfo(name, id, email)
{
var n, i, e;
if (!validate_name(name))
throw "InvalidNameException"
else
n = name;
if (!validate_id(id))
throw "InvalidIdException"
else
i = id;
if (!validate_email(email))
throw "InvalidEmailException"
else
e = email;
cust = (n + " " + i + " " + e);
return (cust);
}
Условные блоки
catch управляют вызовом соответствующего обработчика исключений.
try {
getCustInfo("Lee", 1234, "lee@netscape.com")
}
catch (e if e == "InvalidNameException") {
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
bad_id_handler(e)
}
catch (e if e == "InvalidEmailException") {
bad_email_handler(e)
}
catch (e){
logError(e)
}
Блок finally
Блок finally содержит операторы, выполняемые после выполнения блоков
try и
catch, но до выполнения операторов, идущих после оператора
try...catch. Блок
finally выполняется независимо от того, было ли вызвано исключение. Если исключение вызывается, операторы блока
finally выполняются даже в том случае, если ни один блок
catch не обработал исключение.
Вы можете использовать блок
finally для корректного завершения скрипта при возникновении исключения; например, Вам может понадобиться освободить ресурс, связанный скриптом. В следующем примере файл открывается и операторы работают с ним (серверный JavaScript даёт возможность доступа к файлам). Если вызывается исключение при открытом файле, блок
finally закрывает файл до того, как скрипт потерпит неудачу.
openMyFile();
try {
writeMyFile(theData)
}
finally {
closeMyFile() }
Вложение операторов try...catch
Вы можете вкладывать один или более операторов
try...catch друг в друга. Если внутренний оператор
try...catch не имеет блока
catch, на совпадение проверяется блок
catch содержащего его оператора
try...catch.