В этом уроке описаны логические операторы. 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>
.