Сложные выражения получили свое название благодаря тому, что все они составлены из нескольких простых выражений. Сложные выражения выполняются специальным образом и служат для особых целей — в основном, для управления процессом выполнения содержащихся в них простых выражений.
JavaScript позволяет нам объединить несколько выражений в одно. Такое выражение называется блочным выражением или просто блоком. Составляющие его выражения заключают в фигурные скобки, например:
{
b = "12";
c = a — b;
}
Как правило, блоки не существуют сами по себе. Чаще всего они входят в состав других сложных выражений.
Условное выражение позволяет нам выполнить одно из двух входящих в него выражений в зависимости от выполнения или невыполнения какого-либо условия. В качестве условия используется значение логической переменной или результат вычисления логического выражения.
Листинг 14.7 иллюстрирует формат условного выражения.
Листинг 14.7
if (<условие>)
<блок "то">
else
<блок "иначе">
Существует также другая, "вырожденная" разновидность условного выражения,
содержащая только одно выражение, которое выполняется при выполнении условия и пропускается, если условие не выполнено:
if (<условие>)
<блок "то">
Для написания условных выражений предусмотрены особые ключевые слова if и
else. Отметим, что условие всегда записывают в круглых скобках.
Если условие имеет значение true, то выполняется блок "то". Если же условие имеет значение false, то выполняется блок "иначе" (если он присутствует в условном выражении). А если блок "иначе" отсутствует, выполняется следующее выражение Web-сценария.
ВНИМАНИЕ!
Значения null или undefined преобразуются в false. Не забываем об этом.
Рассмотрим несколько примеров.
В листинге 14.8 мы сравниваем значение переменной x с единицей и в зависимости от результатов сравнения присваиваем переменным f и h разные значения.
Листинг 14.8
if (x == 1) {
a = "Единица";
b = 1;
}
else {
a = "Не единица";
b = 22222;
}
Условие может быть довольно сложным (листинг 14.9).
Листинг 14.9
if ((x == 1) && (y > 10))
f = 3;
else
f = 33;
Здесь мы использовали сложное условие, возвращающее значение true в случае,
если значение переменной x равно 1 и значение переменной y больше 10. Заметим также, что мы подставили одиночные выражения, т. к. фрагменты кода слишком просты, чтобы оформлять их в виде блоков.
Если условное выражение совсем простое, мы можем записать его немного по-другому. А именно, воспользоваться условным оператором ?:
<условие>? <выражение "то">: <выражение "иначе">;
Достоинство этого оператора в том, что он может быть частью выражения. Например:
f = (x == 1 && y > 10)? 3: 33;
Фактически мы записали условное выражение из предыдущего примера, но в виде простого выражения. Компактность кода налицо. Недостаток же оператора? в том, что с его помощью можно записывать только самые простые условные выражения.
Приоритет условного оператора один из самых низких. Приоритет ниже него имеют только операторы присваивания.
Выражение выбора — это фактически несколько условных выражений, объединенных в одном. Его формат иллюстрирует листинг 14.10.
Листинг 14.10
switch (<исходное выражение>) {
case <значение 1> :
<блок 1>
[break;]
[case <значение 2> :
<блок 2>
[break;]]
<… другие секции case>
[default:
<блок, исполняемый для остальных значений>]
}
В выражениях выбора присутствуют ключевые слова switch, case и default.
Результат вычисления исходного выражения последовательно сравнивается со значением 1, значением 2 и т. д. и, если такое сравнение прошло успешно, выполняется соответствующий блок кода (блок 1, блок 2 и т. д.). Если же ни одно сравнение не увенчалось успехом, выполняется блок кода, находящийся в секции default (если, конечно, она присутствует).
Листинг 14.11 иллюстрирует пример выражения выбора.
Листинг 14.11
switch (a) {
case 1:
out = "Единица";
break;
case 2:
out = "Двойка";
break;
case 3:
out = "Тройка";
break;
default:
out = "Другое число";
}
Здесь, если переменная a содержит значение 1, переменная out получит значение "Единица", если 2 — значение "Двойка", а если 3 — значение "Тройка". Если же переменная a содержит какое-то другое значение, переменная out получит значение "Другое число".
Циклы — это особые выражения, позволяющие выполнить один и тот же блок кода несколько раз. Выполнение кода прерывается по наступлению некоего условия. JavaScript предлагает программистам несколько разновидностей циклов. Рассмотрим их подробнее.
Цикл со счетчиком удобен, если какой-то код нужно выполнить строго определенное число раз. Вероятно, это наиболее распространенный вид цикла.
Цикл со счетчиком записывается так:
for (<выражение инициализации>; <условие>; <приращение>)
<тело цикла>
Здесь используется ключевое слово for. Поэтому такие циклы часто называют "циклами for".
Выражение инициализации выполняется самым первым и всего один раз. Оно присваивает особой переменной, называемой счетчиком цикла, некое начальное значение (обычно 1). Счетчик цикла подсчитывает, сколько раз было выполнено тело цикла — собственно код, который нужно выполнить определенное количество раз.
Следующий шаг — проверка условия. Оно определяет момент, когда выполнение цикла прервется и начнет выполняться следующий за ним код. Как правило, условие сравнивает значение счетчика цикла с его граничным значением. Если условие возвращает true, выполняется тело цикла, в противном случае цикл завершается и начинается выполнение кода, следующего за циклом.
После прохода тела цикла выполняется выражение приращения, изменяющее значение счетчика. Это выражение обычно инкрементирует счетчик (увеличивает его значение на единицу). Далее снова проверяется условие, выполняется тело цикла, приращение и т. д., пока условие не станет равно false.
Пример цикла со счетчиком:
for (i = 1; i < 11; i++) {
a += 3;
b = i * 2 + 1;
}
Этот цикл будет выполнен 10 раз. Мы присваиваем счетчику i начальное значение 1 и после каждого выполнения тела цикла увеличиваем его на единицу. Цикл перестанет выполняться, когда значение счетчика увеличится до 11, и условие цикла станет ложным.
Счетчик цикла можно записать в одном из выражений тела цикла, как это сделали
мы. В нашем случае счетчик i будет содержать последовательно возрастающие значения от 1 до 10, которые используются в вычислениях.
Приведем еще два примера цикла со счетчиком:
for (i = 10; i > 0; i-) {
a += 3;
b = i * 2 + 1;
}
Здесь значение счетчика декрементируется. Начальное его значение равно 10. Цикл выполнится 10 раз и завершится, когда счетчик i будет содержать 0; при этом значения последнего будут последовательно уменьшаться от 10 до 1.
for (i = 2; i < 21; i += 2) b = i * 2 + 1;
А в этом примере начальное значение счетчика равно 2, а конечное — 21, но цикл выполнится, опять же, 10 раз. А все потому, что значение счетчика увеличивается на 2 и последовательно принимает значения 2, 4, 6… 20.
Цикл с постусловием во многом похож на цикл со счетчиком: он выполняется до тех пор, пока остается истинным условие цикла. Причем условие проверяется не до, а после выполнения тела цикла, отчего цикл с постусловием и получил свое название. Такой цикл выполнится хотя бы один раз, даже если его условие с самого начала ложно.
Формат цикла с постусловием:
do
<тело цикла>
while (<условие>);
Для задания цикла с постусловием предусмотрены ключевые слова do и while, поэтому такие циклы часто называют "циклами do-while".
Вот пример цикла с постусловием:
do {
a = a * i + 2;
++i;
} while (a < 100);
А вот еще один пример:
var a = 0, i = 1;
do {
a = a * i + 2;
++i;
} while (i < 20);
Хотя здесь удобнее был бы уже знакомый нам и специально предназначенный для таких случаев цикл со счетчиком.
Цикл с предусловием отличается от цикла с постусловием тем, что условие проверяется перед выполнением тела цикла. Так что, если оно (условие) изначально ложно, цикл не выполнится ни разу:
while (<условие>)
<тело цикла>
Для создания цикла с постусловием предусмотрено ключевое слово while. Поэтому такие циклы называют еще "циклами while" (не путать с "циклами do-while"!).
Пример цикла с предусловием:
while (a < 100) {
a = a * i + 2;
++i;
}
Иногда бывает нужно прервать выполнение цикла. Для этого JavaScript предоставляет Web-программистам операторы break и continue.
Оператор прерывания break позволяет прервать выполнение цикла и перейти к следующему за ним выражению:
while (a < 100) {
a = a * i + 2;
if (a > 50) break;
++i;
}
В этом примере мы прерываем выполнение цикла, если значение переменной a превысит 50.
Оператор перезапуска continue позволяет перезапустить цикл, т. е. оставить невыполненными все последующие выражения, входящие в тело цикла, и запустить выполнение цикла с самого его начала: проверка условия, выполнение приращения и тела и т. д.
Пример:
while (a < 100) {
i = ++i;
if (i > 9 && i < 11) continue;
a = a * i + 2;
}
Здесь мы пропускаем выражение, вычисляющее a, для всех значений i от 10 до 20.