--- title: Логическое И (&&) slug: Web/JavaScript/Reference/Operators/Logical_AND tags: - JavaScript - Language feature - Logical Operator - Operator - Reference browser-compat: javascript.operators.logical_and --- {{jsSidebar("Operators")}} Логический оператор И (`&&`) (конъюнкция) для набора операндов со значением типа {{jsxref("Boolean")}} будет `true` только в случае, если все операнды содержат значение `true`. В противном случае это будет `false`. В целом, оператор вернёт значение первого {{Glossary("falsy", "ложноподобного")}} операнда при вычислении, либо значение последнего операнда, если все операнды оказались {{Glossary("truthy", "истиноподобными")}}. {{EmbedInteractiveExample("pages/js/expressions-logical-and.html", "shorter")}} ## Синтаксис ```js expr1 && expr2 ``` ## Описание Логическое И (`&&`) вычисляет операнды слева направо, возвращая сразу значение первого попавшего {{Glossary("falsy", "ложноподобного")}} операнда; если все значения {{Glossary("truthy", "истиноподобны")}}, возвращается значение последнего операнда. Если значение может быть преобразовано в `true`, то оно рассматривается как {{Glossary("truthy", "истиноподобное (truthy)")}}. Если же значение может быть преобразовано в `false`, то оно называется {{Glossary("falsy", "ложноподобным (falsy)")}}. Примеры выражений, которые могут быть преобразованы в `false`: - `false`; - `null`; - `NaN`; - `0`; - пустая строка (`""`, `''`, ` `` `); - `undefined`. Оператор И возвращает небулевы значения как есть: ```js result = '' && 'foo'; // result is assigned "" (empty string) result = 2 && 0; // result is assigned 0 result = 'foo' && 4; // result is assigned 4 ``` Несмотря на то, что оператор `&&` может использоваться с операндами, не содержащие логических значений, он всё равно останется булевым оператором, поскольку его возвращаемое значение всегда можно преобразовать в [булевый примитив](/ru/docs/Web/JavaScript/Data_structures#Boolean_type). Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной [`оператор НЕ`](/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT) или конструктор {{jsxref("Global_Objects/Boolean/Boolean", "Boolean")}}. ### Сокращённое вычисление Оператор логического И вычисляет выражение по сокращённой схеме. Каждый операнд приводится к булевому значению, если результат одного преобразования оказывается `false`, тогда оператор И останавливает дальнейшее вычисление выражения и возвращает исходное значение этого ложноподобного операнда. Поэтому оставшиеся операнды **не** будут вычислены. В качестве примера рассмотрим следующий псевдокод. ``` (ложноподобное выражение) && следующее выражение ``` Поскольку первый операнд `(ложноподобное выражение)` имеет ложное значение, то `следующее выражение` **никогда не будет вычислено**. Если `следующее выражение` содержало функцию, то она бы никогда не была вызвана. Посмотрите пример ниже: ```js function A() { console.log('вызвана функция A'); return false; } function B() { console.log('вызвана функция B'); return true; } console.log( A() && B() ); // В результате вызова функции A, в консоли будет выведено "вызвана функция A", // а оператор && вычислится как false (функция A возвращает false), поэтому далее в консоли появится false; // вследствие этого оператор И прекратит вычисление и проигнорирует функцию B ``` ### Приоритет операторов Оператор И имеет более высокий приоритет, чем оператор ИЛИ, поэтому оператор `&&` выполнится раньше оператора `||` (см. [приоритет операторов](/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)). ```js false || true && true // вернёт true true && (false || false) // вернёт false (2 == 3) || (4 < 0) && (1 == 1) // вернёт false ``` ## Примеры ### Использование оператора И В следующем коде показаны примеры использования оператора `&&` (логическое И). ```js a1 = true && true // t && t вернёт true a2 = true && false // t && f вернёт false a3 = false && true // f && t вернёт false a4 = false && (3 == 4) // f && f вернёт false a5 = 'Cat' && 'Dog' // t && t вернёт "Dog" a6 = false && 'Cat' // f && t вернёт false a7 = 'Cat' && false // t && f вернёт false a8 = '' && false // f && f вернёт "" a9 = false && '' // f && f вернёт false ``` ### Правила преобразования булевых значений #### Конвертация И к ИЛИ Следующая операция с **булевыми значениями**: ```js bCondition1 && bCondition2 ``` всегда эквивалентна: ```js !(!bCondition1 || !bCondition2) ``` #### Конвертация ИЛИ к И Следующая операция с **булевыми значениями**: ```js bCondition1 || bCondition2 ``` всегда эквивалентна: ```js !(!bCondition1 && !bCondition2) ``` ### Удаление вложенных круглых скобок Поскольку логические выражения вычисляются слева направо, всегда можно удалить круглые скобки из сложного выражения при условии соблюдения определенных правил. Следующая составная операция с **булевыми значениями**: ```js bCondition1 || (bCondition2 && bCondition3) ``` это то же самое, что и: ```js bCondition1 || bCondition2 && bCondition3 ``` ## Спецификации {{Specifications}} ## Поддержка браузерами {{Compat}} ## Смотрите также - {{jsxref("Boolean")}} - {{Glossary("Truthy")}} - {{Glossary("Falsy")}}