Книга: JavaScript. Подробное руководство, 6-е издание
4.10.1. Логическое И (&&)
4.10.1. Логическое И (&&)
Условно говоря, оператор &&
действует на трех уровнях. На самом простом уровне, когда в операции участвуют логические операнды, оператор &&
выполняет операцию «логическое И» над двумя значениями: он возвращает true
тогда и только тогда, когда оба операнда имеют значение true
. Если один или оба операнда имеют значение false
, оператор возвращает false
.
Оператор &&
часто используется для объединения двух выражений отношений:
х == 0 && у == 0 // true тогда и только тогда, когда х и у равны 0
Выражения отношений всегда возвращают значение true
или false
, поэтому в подобных ситуациях сам оператор &&
всегда возвращает true
или false
. Операторы отношений имеют более высокий приоритет, чем оператор &&
(и ||
), поэтому такие выражения можно записывать без использования скобок.
Но оператор &&
не требует, чтобы его операнды были логическими значениями. Напомню, что все значения в языке JavaScript являются либо «истинными», либо «ложными». (Подробности в разделе 3.3. Ложными значениями являются false, null, undefined, 0, -0, NaN
и "". Все другие значения, включая все объекты, являются истинными.) На втором уровне оператор &&
действует как логическое И для истинных и ложных значений. Если оба операнда являются истинными, оператор возвращает истинное значение. В противном случае, когда один или оба операнда являются ложными, возвращается ложное значение. В языке JavaScript все выражения и инструкции, использующие логические значения, будут также работать с истинными или ложными значениями, поэтому тот факт, что оператор &&
не всегда возвращает true или false, на практике не вызывает никаких проблем.
Обратите внимание, что в предыдущем абзаце говорилось, что оператор возвращает «истинное значение» или «ложное значение», но при этом не уточнялось, какое именно значение возвращается. Для этого нам необходимо перейти на третий, заключительный уровень оператора &&
. Свою работу оператор начинает с вычисления первого операнда - выражения слева. Если выражение слева возвращает ложное значение, значением всего выражения также должно быть ложное значение, поэтому оператор &&
просто возвращает значение слева и не вычисляет выражение справа.
В противном случае, если значение слева является истинным, тогда результат всего выражения определяется значением справа. Если значение справа является истинным, значением всего выражения также должно быть истинное значение, а если значение справа является ложным, значением всего выражения должно быть ложное значение. Поэтому, когда значение слева является истинным, оператор &&
вычисляет и возвращает значение справа:
var о = { х : 1 };
var р = null;
о && о.х // => 1: о - истинное значение, поэтому возвращается о.х
р && р.х // => null: р - ложное значение, поэтому возвращается р,
// а выражение р.х не вычисляется
Важно понимать, что оператор &&
может не вычислять выражение правого операнда. В примере выше переменная р имеет значение null
, поэтому попытка вычислить выражение р.х привела бы к ошибке ТуреЕггог. Но здесь задействован оператор &&, благодаря чему выражение р.х вычисляется, только если р будет содержать истинное значение - не null или undefined.
Такое поведение оператора &&
иногда называют «короткой схемой вычислений», и иногда можно встретить программный код, в котором такое поведение оператора &&
используется специально для выполнения инструкций по условию. Например, следующие две строки дают одинаковый результат:
if (а == b) stop(); // Функция stop() вызывается, только если а == b
(а == b) && stop(); // То же самое
В целом следует с осторожностью использовать выражения с побочными эффектами (присваивания, инкременты, декременты или вызовы функций) справа от оператора &&
, потому что эти побочные эффекты будут проявляться в зависимости от значения слева.
Несмотря на довольно запутанный алгоритм работы этого оператора, проще всего и абсолютно безопасно рассматривать его как оператор булевой алгебры, который манипулирует истинными и ложными значениями.
- Chapter 14. Example scripts
- Appendix J. Example scripts code-base
- Example NAT machine in theory
- Timestamp request
- example rc.firewall
- Example rc.firewall script
- Example rc.DMZ.firewall script
- Example rc.UTIN.firewall script
- Example rc.DHCP.firewall script
- Example rc.flush-iptables script
- Example rc.test-iptables script
- Почему в ноутбуке пропали системные звуки? При этом звуковые файлы воспроизводятся только в Winamp. Переустанавливал дра...