В этом уроке описаны логические операторы. JavaScript поддерживает три логических оператора: || (ИЛИ), && (И) и ! (НЕ), которые очень часто используются в условных конструкциях, например if, while или for. Благодаря логическим операторам можно объединять два выражения в одно более сложное.

Основными логическими или булевыми операциями, названными в честь одного из математиков — Джорджа Буля (1815-1864), являются:

  • ИЛИ || – логическое сложение (дизъюнкция) – OR;
  • И && – логическое умножение (конъюнкция) – AND;
  • НЕ ! – логическое отрицание (инверсия) – NOT.

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

Табnица истинности дпя логических операторов
XYX || YX && Y!X
falsefalsefalsefalsetrue
truefalsetruefalsefalse
falsetruetruefalsetrue
truetruetruetruefalse

Из этой таблицы видно, что результатом работы оператора ИЛИ || будет false, только если оба его операнда – false; результатом оператора И && будет true, только если оба из его операндов – true. Оператор НЕ ! прост – он получает один операнд и возвращает обратное значение.

Логические операторы не требуют, что бы их операнды были логическими значениями. Стоит отметить, что все значения в языке JavaScript являются либо истинными true, либо ложными false.

На заметку: Ложными (false) значениями являются false, null, undefined, 0, –0, NaN и "" (пустя строка). Все другие значения, включая все объекты, являются истинными (true).

Логический оператор И && выполняет логическую операцию конъюнкции двух булевых значений. Конъюнкция – это сложное логическое выражение, которое считается истинным true только в том случае, когда оба его операнда (выражения) являются истинными true, во всех остальных случаях данное сложное выражение ложно false.

Примеры:

Выполнить код »

Часто оператор И && используется совместно с двумя выражениями сравнения:

Выполнить код »

Операторы сравнения, согласно таблицы приоритетов, имеют более высокий приоритет, чем логические операторы && и ||, поэтому приведенное выше выражение можно писать без скобок.

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

Например, в следующем примере число 1 будет воспринято как true, а 0 – как false:

Выполнить код »

Логическое И && начинает работу с вычисления левого операнда. Если получившееся значение может быть преобразовано в false (например, null, undefined, 0, –0, NaN или ""), значит, результат выражения равен false или непреобразованному значению левого выражения. Поэтому вычисление и преобразование второго операнда не выполняется. В противном случае, если значение слева является истинным, тогда результат всего выражения определяется значением справа. Поэтому, когда значение слева является истинным, оператор && вычисляет и возвращает значение справа:

Выполнить код »

Итак, оператор && вычисляет операнды слева направо до первого ложного false аргумента и возвращает его значение, а если все операнды истинные true – то возвращается значение последнего. Если первый операнд – false, то результат будет false, и остальные значения игнорируются.

Такое поведение оператора &&, позволяющее экономить ресурсы и не вычислять правый аргумент, иногда называют «короткой схемой вычислений».

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

Выполнить код »

При выполнении логического И && в этом коде возникает ошибка, потому что переменная y не объявлена. Значение левого операнда – true, поэтому интерпретатор переходит к оценке правого операнда. Если изменить значение левого операнда на false, ошибка не возникает:

Выполнить код »

В этом примере переменная y тоже не определена, но правый операнд никогда не оценивается, потому что левый операнд равен false и, следовательно, результатом данного кода тоже может быть только false. Используя оператор И &&, помните о так называемой «сокращенной схеме его вычисления».

Оператор логическое ИЛИ || вычисляет дизъюнкцию (логическим сложением) двух операндов. Если хотя бы один или оба операнда преобразуются в true, он возвращает true или непреобразованное значение. Если же оба операнда преобразуются в false, он возвращает false или непреобразованное значение.

Логическое ИЛИ ||, как и логическое И && поддерживает сокращенные вычисления.

В этом прмере правый операнд не оценивается, потому что левый эквивалентен значению true, например:

Выполнить код »

Если же левый операнд имеет значение false или значение, которое может быть преобразовано в false, оператор || переходит к вычислению значения правого операнда, и возвращает его значение:

Выполнить код »

На заметку: Логическое ИЛИ || вычисляет операнды слева направо до первого истинного значения и возвращает его, а если все значения ложные – то возвращает последнее значение.

Оператор логического НЕ ! является унарным оператором, помещаемым перед одиночным операндом. Он преобразует значение своего операнда в булево значение, затем инвертирует это значение в противоположное и возвращает, полученное в результате инвертирования, булево значение.

Вот некоторые примеры:

Выполнить код »

Таким обазом, оператор ! всегда возвращает true или false, поэтому его можно использовать для преобразования любого значения x в его логический эквивалент, дважды применив этот оператор: !!x.

Выполнить код »

Оператор НЕ !, будучи унарным, имеет высокий приоритет (16) и тесно связан с своим аргументом. Приоритет оператора И && больше, чем приоритет оператора ИЛИ || – соответственно 6 и 5.

Учитывая приоритетность логических операторов, следующие проверки на идентичность дают истинный true результат при любых значениях выражений x и y:

Выполнить код »

В следующем коде сначала будет вычислено правое логическое И &&, а уже потом – &&:

Выполнить код »

Изменить результат сложного выражения можно применив в нужном месте кода скобки ():

Выполнить код »
  • Логическое И && возвращает true тогда и только тогда, когда оба операнда преобразуются в true.
  • Логическое ИЛИ || возвращает true если хотя бы один или оба операнда преобразуются в true.
  • Операторы && и || поддерживают сокращенное вычисление: если первого операнда достаточно для определения результата, второй операнд не оценивается. Так, если первый операнд логического И && эквивалентен значению false, то второй операнд не оценивается. В случае с логическим ИЛИ || наоборот, правый операнд не оценивается, если левый эквивалентен значению true.
  • Логическое отрицание НЕ ! используется для инверсии (переворачивание смысла) логического значения своего операнда и всегда возвращает true или false.
  • С помощью двух логических НЕ !! можно преобразовать значение операнда в его логический эквивалент.
  • Логические операторы !, && и || имеют разные приоритеты – соответственно 16, 6 и 5. Поэтому встретившись в одном выражении (без приоритетных скобок) эти операторы выполнятся в указанной последовательности.

  • Что выведет это комбинирование логических операторов?

    var a = "";
    var b = 9;
    var c = null;
    alert( !(!a || !b && !c) ); 
    
    Показать решение

    Решение:

    Оператор ! преобразует значение своего операнда в булево значение, затем инвертирует это значение в противоположное и возвращает полученное в результате инвертирования булево значение: true или false. Приоритет оператора && выше, чем ||, поэтому он выполнится первым.
    1. Оператор И && получит выражение слева !9 т.е. ложное значение false, поэтому оператор && просто возвращает значение слева и не вычисляет выражение справа.
    2. Оператор ИЛИ || получит в качестве первого операнда true, поэтому до правого операнда дело не дойдёт, вычисления закончатся на левом. Оператор || вернёт значение true.
    3. И, наконец, оператор ! возвращает противоположное значение всего выражения, т.е. false.

    Выполнить код »
  • Выберите правильный логический оператор в следующем выражении, чтобы в результате было отображено значение переменной b.

    var a = "", b = 7, c = 1, d = 2;
    
    alert( a || c /*логический оператор*/ b || d );
    
    Показать решение

    Решение:

    1. Приоритет оператора И && выше, чем ИЛИ ||, поэтому он выполнится первым и вернёт значение второго истинного операнда, в нашем случае – 7.
    2. Следующим выполнится левый оператор ||, который тоже вернёт – 7.
    3. И, наконец, выполнится правый оператор ||, который вернёт первый истинный операнд – 7.

    Выполнить код »
  • Что выведет следующий код, состоящий из нескольких &&?

    var a = 1, b = 7, c = 0, d = 2;
    
      alert( a && b && c && d );
    
    Показать решение

    Решение:

    Код выведет значение переменной c – первое значение из списка, которое может быть преобразовано в false.

    Выполнить код »
  • Что выведет следующий код, состоящий из нескольких ||?

    var a = "", b = null, c = 1, d = 2;
    
      alert( a || b || c || d );
    
    Показать решение

    Решение:

    Код выведет значение переменной c – первое значение из списка, которое может быть преобразовано в true.

    Выполнить код »

Комментарии

пожелания к комментариям…
  • Приветствуются комментарии, соответствующие теме урока: вопросы, ответы, предложения.
  • Одну строчку кода оборачивайте в тег <code>, несколько строчек кода — в теги <pre><code>...ваш код...</code></pre>.
  • Допускаются ссылки на онлайн-песочницы (codepen, plnkr, JSBin и др.).