Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

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

  1. Операторы
    1. || (ИЛИ)
    2. Короткий цикл вычислений
    3. Значение ИЛИ
    4. && (И)
    5. ! (НЕ)

Для проверки нескольких условий одновременно используются логические операторы.

В 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;

  1. Он сначала приводит аргумент к логическому типу true/false,
  2. а затем возвращает противоположное значение.

Например:

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('третье');


Комментарии

  1. Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  2. Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
  3. Комментарии без смысла, с рекламой или не о статье вообще - удаляются.
Наверх

Содержание

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!