Для проверки нескольких условий одновременно используются логические операторы.
В JavaScript поддерживаются операторы || (ИЛИ), && (И) и ! (НЕ).
Они называются логическими, но в JavaScript могут применяться к значениям любого типа и возвращают также значения любого типа.
Операторы
|| (ИЛИ)
Оператор ИЛИ выглядит как двойной символ вертикальной черты:
result = a || b;
Логическое ИЛИ в классическом программировании работает следующим образом: «если хотя бы один из аргументов true, то возвращает true, иначе — false».
Получается следующая таблица результатов:
alert( true || true ); // true alert( false || true ); // true alert( true || false); // true alert( false || false); // false
Обычно оператор ИЛИ используется в if, чтобы проверить, выполняется ли хотя бы одно из условий, например:
var hour = 9;
if (hour < 10 || hour > 18) {
alert('Офис до 10 или после 18 закрыт');
}
Можно передать и больше условий:
var hour = 12, isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
alert('Офис до 10 или после 18 или в выходной закрыт');
}
При вычислении ИЛИ любые значения интерпретируются как логические.
Например, число 1 будет воспринято как true, а 0 — как false:
if ( 1 || 0 ) { // сработает аналогично true || false
alert('верно');
}
Короткий цикл вычислений
JavaScript вычисляет несколько ИЛИ слева направо. При этом, чтобы экономить ресурсы, используется так называемый «короткий цикл вычисления».
Допустим, передано несколько аргументов: a || b || c || .... Если первый аргумент — true, то результат заведомо будет true, и остальные значения игнорируются.
Это особенно заметно, когда выражение, переданное в качестве второго аргумента, имеет сторонний эффект — например, присваивает переменную.
При запуске примера ниже присвоение x не произойдёт:
var x; *!*true*/!* || (x = 1); // просто вычислим ИЛИ, без if alert(x); // undefined, x не присвоен
…А в примере ниже первый аргумент — false, так что ИЛИ попытается вычислить второй, запустив тем самым присваивание:
var x; *!*false*/!* || (x = 1); alert(x); // 1
Значение ИЛИ
Оператор ИЛИ возвращает то значение, на котором остановились вычисления. Это будет левый аргумент, если в логическом контексте он является true, а иначе — правый.
Примеры:
alert( 1 || 0 ); // 1 alert( true || 'неважно что'); // true alert( null || 1 ); // 1 alert( undefined || 0 ); // 0
Это используют, в частности, чтобы выбрать первое «истинное» значение из списка:
var a, b; // переменные не присвоены, т.е. равны undefined var n = 0; var msg = "Привет!"; *!* var result = a || b || n || msg || 0; */!* alert(result) // "Привет!" - первое значение, которое является true
&& (И)
Оператор И пишется как два амперсанда &&:
result = a && b;
В классическом программировании он оперирует логическими значениями и возвращает true, если оба аргумента истинны, а иначе — false:
alert( true && true ); // true alert( false && true ); // false alert( true && false); // false alert( false && false); // false
К нему применим тот же принцип «короткого цикла вычислений»: если левый аргумент — false, оператор И возвращает его и заканчивает вычисления. Иначе — вычисляет и возвращает правый аргумент.
Например:
// Первый аргумент - true, // Поэтому возвращается второй аргумент alert(1 && 0); // 0 alert(1 && 5); // 5 // Первый аргумент - false, // Он и возвращается, а второй аргумент игнорируется alert(null && 5); // null alert(0 && "не важно"); // 0
Приоритет оператора И больше, чем ИЛИ, т.е. он выполняется раньше.
В примере ниже сначала будет вычислена правое И: 1 && 0 = 0, а потом — левое ИЛИ.
alert(5 || 1 && 0); // 5
! (НЕ)
Оператор НЕ — самый простой. Он получает один аргумент:
var result = !a;
- Он сначала приводит аргумент к логическому типу
true/false, - а затем возвращает противоположное значение.
Например:
alert( !true ) // false alert( !0 ) // true
Двойное НЕ используется для преобразования значений к логическому типу:
alert( !!"строка" ) // true alert( !!null ) // false
Напишите условие if для проверки того факта, что переменная age находится между 14 и 90 включительно.
if (age >= 14 && age <= 90)
Напишите условие if для проверки того факта, что age НЕ находится между 14 и 90 включительно.
Сделайте два варианта условия: первый с использованием оператора НЕ !, второй - без этого оператора.
Первый вариант:
if ( !(age >= 14 && age <= 90) )
Второй вариант:
if (age < 14 || age > 90)
Какие из этих if верны, т.е. выполнятся? Какие значения будут результатами вычислений внутри if?
if (-1 || 0) alert('первое');
if (-1 && 0) alert('второе');
if (null || -1 && 1) alert('третье');
Ответ: первое и третье:
// верно, т.к. -1 в логическом контексте true
if (-1 || 0) alert('первое'); // -1 || 0 = -1
// неверно, т.к. -1 станет true, а 0 станет false
if (-1 && 0) alert('второе'); // -1 && 0 = 0
// оператор && имеет больший приоритет, чем ||
// так что -1 && 1 выполнится раньше, будет null || 1 = 1
// итого: 1
if (null || -1 && 1) alert('третье');
Комментарии
- Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
- Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
- Комментарии без смысла, с рекламой или не о статье вообще - удаляются.