Клавиша / esc

Логические операторы

Объединяем несколько простых условий в одно сложное.

Время чтения: меньше 5 мин

Кратко

Скопировано

Логические операторы помогают составлять сложные логические условия, которые часто нужны при ветвлении с помощью if...else.

Как пишется

Скопировано

И, &&

Скопировано

Интернет-магазин показывает цены со скидкой только зарегистрированному пользователю, сделавшему больше одной покупки.

В описании два условия, которые должны одновременно быть верными:

  • пользователь должен быть зарегистрирован;
  • количество покупок должно быть больше одной.

Если одно из условий, или оба сразу неверны, то цену показывать не нужно.

Именно по такому принципу работает оператор логическое И, пишется &&. Если соединить с его помощью два выражения, то результат будет равен истине только тогда, когда оба выражения истинны:

        
          
          if (isRegistered === true && orders > 1) {  // Показываем цены}
          if (isRegistered === true && orders > 1) {
  // Показываем цены
}

        
        
          
        
      
Открыть демо в новой вкладке

Обычно для того, чтобы понять, как работают логические операторы, рисуют таблицу истинности. В ячейках — итоговое значение операции при соответствующих операндах:

&& true false
true true false
false false false

ИЛИ, ||

Скопировано

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

Чтобы написать такое составное условие, воспользуйтесь оператором логического ИЛИ, обозначается как две вертикальные черты ||. Логическое или вернёт true, если хотя бы одно из условий true.

Генерируйте гостей в демо и смотрите, как отрабатывает условие, которое записано так:

        
          
          if (hasTicket || isInvited) { ... }
          if (hasTicket || isInvited) { ... }

        
        
          
        
      
Открыть демо в новой вкладке
|| true false
true true true
false true false

НЕ !

Скопировано

Оператор «логическое НЕ» превращает true в false и наоборот.

Он записывается в виде восклицательного знака ! перед операндом: !операнд. Чаще всего это переменная. Например, !myVariable. Операторы, которые производят операцию над одним операндом, называются унарными.

Например, мы можем предлагать купить билет посетителю без билета:

        
          
          if (!hasTicket) {  // Купи билет, дорогой!}
          if (!hasTicket) {
  // Купи билет, дорогой!
}

        
        
          
        
      

На практике

Скопировано

Сергей Минаков советует

Скопировано

🛠 Оператор «ИЛИ» (||) можно использовать для установки значения по умолчанию. Для этого используйте следующую конструкцию:

        
          
          value = value || 'Значение по умолчанию'
          value = value || 'Значение по умолчанию'

        
        
          
        
      

Или можно использовать сокращённый вариант:

        
          
          value ||= 'Значение по умолчанию'
          value ||= 'Значение по умолчанию'

        
        
          
        
      

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

        
          
          let searchEngine1 = 'Яндекс'let searchEngine2searchEngine1 = searchEngine1 || 'Google'searchEngine2 = searchEngine2 || 'Google'console.log(searchEngine1)// Яндексconsole.log(searchEngine2)// Google (значение по умолчанию)
          let searchEngine1 = 'Яндекс'
let searchEngine2

searchEngine1 = searchEngine1 || 'Google'
searchEngine2 = searchEngine2 || 'Google'

console.log(searchEngine1)
// Яндекс

console.log(searchEngine2)
// Google (значение по умолчанию)

        
        
          
        
      

Такой способ работает из-за особенности оператора «ИЛИ». Он не приводит значения к типу Boolean, а просто возвращает то, что стоит левее или правее.

  • Если левое значение можно привести к true, оператор возвращает левое значение.
  • Если левое значение можно привести к false, оператор возвращает правое значение.
        
          
          console.log(null || 0)// 0console.log(0 || null)// nullconsole.log('Собака' || 'Кошка')// Собака
          console.log(null || 0)
// 0

console.log(0 || null)
// null

console.log('Собака' || 'Кошка')
// Собака

        
        
          
        
      

В последнем примере JavaScript приводит левое значение к типу Boolean и получает true, из-за чего решает вернуть именно его ('Собака'), а на правое даже не смотрит.

🛠 Оператор «И» (&&) можно использовать в React-компонентах, когда мы хотим что-то показать или спрятать в зависимости от определённого условия. Для этого нужно воспользоваться следующей jsx-конструкцией:

        
          
          <>  {    condition &&    <p>      Если condition == true,      то показываем этот текст.    </p>  }</>
          <>
  {
    condition &&
    <p>
      Если condition == true,
      то показываем этот текст.
    </p>
  }
</>

        
        
          
        
      

Давайте напишем небольшой компонент, который будет выводить секретное сообщение только тем пользователям, которые ввели правильный пароль:

        
          
          import React, { useState } from 'react'export default function App() {  const [password, setPassword] = useState('')  return (    <>      <h1>Введите пароль, чтобы увидеть секрет</h1>      <label>        <span>Пароль</span>        <input          type="password"          value={password}          onChange={(e) => setPassword(e.target.value)}        />      </label>      {        password === '123456' &&        <p>Секрет: Дока — сокращение от «документация»</p>      }    </>  )}
          import React, { useState } from 'react'

export default function App() {
  const [password, setPassword] = useState('')

  return (
    <>
      <h1>Введите пароль, чтобы увидеть секрет</h1>

      <label>
        <span>Пароль</span>
        <input
          type="password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
        />
      </label>

      {
        password === '123456' &&
        <p>Секрет: Дока — сокращение от «документация»</p>
      }
    </>
  )
}

        
        
          
        
      

Такой способ работает из-за того, что оператор «И» не приводит значения к типу Boolean, а просто возвращает то, что стоит левее или правее.

  • Если левое значение можно привести к true, то оператор возвращает правое значение.
  • Если левое значение можно привести к false, то оператор возвращает левое значение.
        
          
          console.log(null && 0)// nullconsole.log(0 && null)// 0console.log('Лево' && 'Право')// Право
          console.log(null && 0)
// null

console.log(0 && null)
// 0

console.log('Лево' && 'Право')
// Право

        
        
          
        
      

JavaScript приводит левое значение к типу Boolean и получает true, из-за чего решает вернуть правое значение ('Право').

🛠 Двойное отрицание (!!) можно использовать, если хотим привести значение к логическому типу данных. Такой же результат получится, если использовать функцию Boolean.

        
          
          const value = 'Непустая строка'console.log(Boolean(value))// trueconsole.log(!!value)// true
          const value = 'Непустая строка'

console.log(Boolean(value))
// true

console.log(!!value)
// true

        
        
          
        
      

На собеседовании

Скопировано
Задать вопрос в рубрику
🤚 Я знаю ответ

Viktar Nezhbart  отвечает

Скопировано

Оператор логическое И (&&) используется для вычисления логических выражений, состоящих из двух и более операндов.

С помощью оператора && можно решать несколько задач.

  1. Объединять несколько логических условий в одно. Например:
        
          
          if (year > 1970 && year < 2000 && year !== 1991) {  // Выполняем какие-то действия}
          if (year > 1970 && year < 2000 && year !== 1991) {
  // Выполняем какие-то действия
}

        
        
          
        
      
  1. Выполнять сокращённые вычисления (short-circuit). Вычисление значения производится слева направо. Если результат при приведении к boolean является ложным (falsy) значением, то дальнейшие вычисления не требуются. Например:
        
          
          name !== '' && showInfoByName(name)
          name !== '' && showInfoByName(name)

        
        
          
        
      

Функция showInfoByName() будет выполнена только если условие name !== '' является истиной. Это эквивалентно использованию if:

        
          
          if (name !== '') {  showInfoByName(name)}
          if (name !== '') {
  showInfoByName(name)
}