Логические операторы, как правило, используются с булевыми значениями и возвращают булево значение.
Однако, в javascript операторы && и || возвращают не булево значение, а один из операндов, определивший значение выражения. Конечно, результат в таком случае может быть и не булевым.
Логические операторы описаны следующей таблицей:
| Оператор |
Использование |
Описание |
Логическое И (&&) |
expr1 && expr2 |
Возвращает expr1, если оно может быть преобразовано к false; в ином случае возвращает expr2. Так что, при вызове с булевыми значениями, && вернет true только если оба операнда истинны, иначе false. |
Логическое ИЛИ (||) |
expr1 || expr2 |
Возвращает expr1, если оно может быть преобразовано к true; в ином случае возвращает expr2. Так что, при вызове с булевыми значениями, || вернет true только в том случае, когда хотя бы один операнд истинен, иначе вернет false. |
Логическое НЕ (!) |
!expr |
Возвращает false, если операнд может быть преобразован к true, в ином случае возвращает true. |
К false преобразуются, например: null, 0, пустая строка ("") и undefined.
Хотя операторы && и || и могут быть использованы для возвращения небулевых значений, они все же логические, так как возвращаемые значения могут быть приведены к булевому типу.
Оператор ! также используется для быстрого преобразования выражения к булевому значению:
!!"string" = true
!!null = false
Сокращенные вычисления
Так как логические выражения вычисляются слева направо, они проверяются на возможность "сокращенных вычислений" по следующим правилам:
false && что угодно становится false.
true || что угодно становится true.
Эти правила логики гарантируют, что результат всегда правильный, но лишних вычислений при этом не проводится. Как следствие, невычисленные выражения не дадут побочных эффектов:
a =1
check = 5 || (a=3)
alert(a) // 1
Хорошая статья, но Вы забыли про изключающее или (xor)
В JS есть только побитовый XOR
Что приоритетнее в коде, И или ИЛИ?
Что будет выполняться сначала ,а что после:
if (a = b || a > b && a < c)
Как это будет звучать?
Если а = b или a > b, и вместе с этим a < b.
Если a = b или b < a < c?
Как?
Скобки расставь и будет тебе счастье.
Почему плохо (если плохо) писать:
flag && some_func();вместо
if (flag) {some_func();
}
?
JSlint ругается. Может быть существует какая-то угроза, что в будущем логические вычисления будут делаться не по короткой схеме?
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.