JavaScript. Подробное руководство, 6-е издание, стр. 41

Оператор

<b>&amp;&amp;</b>
часто используется для объединения двух выражений отношений:

<b>х == 0 &amp;&amp; у == 0 // true тогда и только тогда, когда х и у равны 0</b>

Выражения отношений всегда возвращают значение

<b>true</b>
или
<b>false</b>
, поэтому в подобных ситуациях сам оператор
<b>&amp;&amp;</b>
всегда возвращает
<b>true</b>
или
<b>false</b>
. Операторы отношений имеют более высокий приоритет, чем оператор
<b>&amp;&amp;</b>
<b>||</b>
), поэтому такие выражения можно записывать без использования скобок.

Но оператор

<b>&amp;&amp;</b>
не требует, чтобы его операнды были логическими значениями. Напомню, что все значения в языке JavaScript являются либо «истинными», либо «ложными». (Подробности в разделе 3.3. Ложными значениями являются
<b>false, null, undefined, 0, -0, NaN</b>
и "". Все другие значения, включая все объекты, являются истинными.) На втором уровне оператор
<b>&amp;&amp;</b>
действует как логическое И для истинных и ложных значений. Если оба операнда являются истинными, оператор возвращает истинное значение. В противном случае, когда один или оба операнда являются ложными, возвращается ложное значение. В языке JavaScript все выражения и инструкции, использующие логические значения, будут также работать с истинными или ложными значениями, поэтому тот факт, что оператор
<b>&amp;&amp;</b>
не всегда возвращает true или false, на практике не вызывает никаких проблем.

Обратите внимание, что в предыдущем абзаце говорилось, что оператор возвращает «истинное значение» или «ложное значение», но при этом не уточнялось, какое именно значение возвращается. Для этого нам необходимо перейти на третий, заключительный уровень оператора

<b>&amp;&amp;</b>
. Свою работу оператор начинает с вычисления первого операнда - выражения слева. Если выражение слева возвращает ложное значение, значением всего выражения также должно быть ложное значение, поэтому оператор
<b>&amp;&amp;</b>
просто возвращает значение слева и не вычисляет выражение справа.

В противном случае, если значение слева является истинным, тогда результат всего выражения определяется значением справа. Если значение справа является истинным, значением всего выражения также должно быть истинное значение, а если значение справа является ложным, значением всего выражения должно быть ложное значение. Поэтому, когда значение слева является истинным, оператор

<b>&amp;&amp;</b>
вычисляет и возвращает значение справа:

<b>var о = { х : 1 }; </b>

<b>var р = null;</b>

<b>о &amp;&amp; о.х // =&gt; 1: о - истинное значение, поэтому возвращается о.х</b>

<b>р &amp;&amp; р.х // =&gt; null: р - ложное значение, поэтому возвращается р,</b>

<b>         // а выражение р.х не вычисляется</b>

Важно понимать, что оператор

<b>&amp;&amp;</b>
может не вычислять выражение правого операнда. В примере выше переменная р имеет значение
<b>null</b>
, поэтому попытка вычислить выражение р.х привела бы к ошибке ТуреЕггог. Но здесь задействован оператор &&, благодаря чему выражение р.х вычисляется, только если р будет содержать истинное значение - не null или undefined.

Такое поведение оператора

<b>&amp;&amp;</b>
иногда называют «короткой схемой вычислений», и иногда можно встретить программный код, в котором такое поведение оператора
<b>&amp;&amp;</b>
используется специально для выполнения инструкций по условию. Например, следующие две строки дают одинаковый результат:

<b>if (а == b) stop(); // Функция stop() вызывается, только если а == b </b>

<b>(а == b) &amp;&amp; stop(); // То же самое</b>

В целом следует с осторожностью использовать выражения с побочными эффектами (присваивания, инкременты, декременты или вызовы функций) справа от оператора

<b>&amp;&amp;</b>
, потому что эти побочные эффекты будут проявляться в зависимости от значения слева.

Несмотря на довольно запутанный алгоритм работы этого оператора, проще всего и абсолютно безопасно рассматривать его как оператор булевой алгебры, который манипулирует истинными и ложными значениями.

4.10.2. Логическое ИЛИ (||)

Оператор

<b>||</b>
выполняет операцию «логическое ИЛИ» над двумя операндами. Если один или оба операнда имеют истинное значение, он возвращает истинное значение. Если оба операнда имеют ложные значения, он возвращает ложное значение.

Хотя оператор 

<b>||</b>
чаще всего применяется просто как оператор «логическое ИЛИ», он, как и оператор
<b>&amp;&amp;</b>
, ведет себя более сложным образом. Его работа начинается с вычисления первого операнда, выражения слева. Если значение этого операнда является истинным, возвращается истинное значение. В противном случае оператор вычисляет второй операнд, выражение справа, и возвращает значение этого выражения.

Как и при использовании оператора

<b>&amp;&amp;</b>
, следует избегать правых операндов, имеющих побочные эффекты, если только вы умышленно не хотите воспользоваться тем обстоятельством, что выражение справа может не вычисляться.

Характерное использование этого оператора заключается в том, что он выбирает первое истинное значение из предложенного множества альтернатив:

<b>// Если переменная max_width определена, используется ее значение. В противном случае </b>

<b>// значение извлекается из объекта preferences. Если объект (или его свойство max_with) </b>

<b>// не определен, используется значение константы, жестко определенной в тексте программы, </b>

<b>var max = max_width || preferences.max_width || 500;</b>

Этот прием часто используется в функциях для определения значений по умолчанию параметров: