JavaScript. Подробное руководство, 6-е издание
Оператор
часто используется для объединения двух выражений отношений:<b>&&</b><b>х == 0 && у == 0 // true тогда и только тогда, когда х и у равны 0</b>Выражения отношений всегда возвращают значение
или<b>true</b>, поэтому в подобных ситуациях сам оператор<b>false</b>всегда возвращает<b>&&</b>или<b>true</b>. Операторы отношений имеют более высокий приоритет, чем оператор<b>false</b>(и<b>&&</b>), поэтому такие выражения можно записывать без использования скобок.<b>||</b>Но оператор
не требует, чтобы его операнды были логическими значениями. Напомню, что все значения в языке JavaScript являются либо «истинными», либо «ложными». (Подробности в разделе 3.3. Ложными значениями являются<b>&&</b>и "". Все другие значения, включая все объекты, являются истинными.) На втором уровне оператор<b>false, null, undefined, 0, -0, NaN</b>действует как логическое И для истинных и ложных значений. Если оба операнда являются истинными, оператор возвращает истинное значение. В противном случае, когда один или оба операнда являются ложными, возвращается ложное значение. В языке JavaScript все выражения и инструкции, использующие логические значения, будут также работать с истинными или ложными значениями, поэтому тот факт, что оператор<b>&&</b>не всегда возвращает true или false, на практике не вызывает никаких проблем.<b>&&</b>Обратите внимание, что в предыдущем абзаце говорилось, что оператор возвращает «истинное значение» или «ложное значение», но при этом не уточнялось, какое именно значение возвращается. Для этого нам необходимо перейти на третий, заключительный уровень оператора
. Свою работу оператор начинает с вычисления первого операнда - выражения слева. Если выражение слева возвращает ложное значение, значением всего выражения также должно быть ложное значение, поэтому оператор<b>&&</b>просто возвращает значение слева и не вычисляет выражение справа.<b>&&</b>В противном случае, если значение слева является истинным, тогда результат всего выражения определяется значением справа. Если значение справа является истинным, значением всего выражения также должно быть истинное значение, а если значение справа является ложным, значением всего выражения должно быть ложное значение. Поэтому, когда значение слева является истинным, оператор
вычисляет и возвращает значение справа:<b>&&</b><b>var о = { х : 1 }; </b><b>var р = null;</b><b>о && о.х // => 1: о - истинное значение, поэтому возвращается о.х</b><b>р && р.х // => null: р - ложное значение, поэтому возвращается р,</b><b> // а выражение р.х не вычисляется</b>Важно понимать, что оператор
может не вычислять выражение правого операнда. В примере выше переменная р имеет значение<b>&&</b>, поэтому попытка вычислить выражение р.х привела бы к ошибке ТуреЕггог. Но здесь задействован оператор &&, благодаря чему выражение р.х вычисляется, только если р будет содержать истинное значение - не null или undefined.<b>null</b>Такое поведение оператора
иногда называют «короткой схемой вычислений», и иногда можно встретить программный код, в котором такое поведение оператора<b>&&</b>используется специально для выполнения инструкций по условию. Например, следующие две строки дают одинаковый результат:<b>&&</b><b>if (а == b) stop(); // Функция stop() вызывается, только если а == b </b><b>(а == b) && stop(); // То же самое</b>В целом следует с осторожностью использовать выражения с побочными эффектами (присваивания, инкременты, декременты или вызовы функций) справа от оператора
, потому что эти побочные эффекты будут проявляться в зависимости от значения слева.<b>&&</b>Несмотря на довольно запутанный алгоритм работы этого оператора, проще всего и абсолютно безопасно рассматривать его как оператор булевой алгебры, который манипулирует истинными и ложными значениями.
4.10.2. Логическое ИЛИ (||)
Оператор
выполняет операцию «логическое ИЛИ» над двумя операндами. Если один или оба операнда имеют истинное значение, он возвращает истинное значение. Если оба операнда имеют ложные значения, он возвращает ложное значение.<b>||</b>Хотя оператор
чаще всего применяется просто как оператор «логическое ИЛИ», он, как и оператор<b>||</b>, ведет себя более сложным образом. Его работа начинается с вычисления первого операнда, выражения слева. Если значение этого операнда является истинным, возвращается истинное значение. В противном случае оператор вычисляет второй операнд, выражение справа, и возвращает значение этого выражения.<b>&&</b>Как и при использовании оператора
, следует избегать правых операндов, имеющих побочные эффекты, если только вы умышленно не хотите воспользоваться тем обстоятельством, что выражение справа может не вычисляться.<b>&&</b>Характерное использование этого оператора заключается в том, что он выбирает первое истинное значение из предложенного множества альтернатив:
<b>// Если переменная max_width определена, используется ее значение. В противном случае </b><b>// значение извлекается из объекта preferences. Если объект (или его свойство max_with) </b><b>// не определен, используется значение константы, жестко определенной в тексте программы, </b><b>var max = max_width || preferences.max_width || 500;</b>Этот прием часто используется в функциях для определения значений по умолчанию параметров: