В этом уроке описаны логические операторы. JavaScript поддерживает три логических оператора: || (ИЛИ), && (И) и ! (НЕ), которые очень часто используются в условных конструкциях, например if, while или for. Благодаря логическим операторам можно объединять два выражения в одно более сложное.
JavaScript: Табnица истинности
Основными логическими или булевыми операциями, названными в честь одного из математиков — Джорджа Буля (1815-1864), являются:
- ИЛИ
||– логическое сложение (дизъюнкция) – OR; - И
&&– логическое умножение (конъюнкция) – AND; - НЕ
!– логическое отрицание (инверсия) – NOT.
Логические операторы работают с операндами так же, как и с булевыми значениями, возвращая true или false, поэтому эти операции можно описать таблицей истинности, в которой полностью описано их поведение:
| X | Y | X || Y | X && Y | !X |
|---|---|---|---|---|
| false | false | false | false | true |
| true | false | true | false | false |
| false | true | true | false | true |
| true | true | true | true | false |
Из этой таблицы видно, что результатом работы оператора ИЛИ || будет 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>.