Объясните по поводу && в JS

Можете объяснить почему:

const a = 3;
const b = -2;
console.log(b && a > 0);

Возвращает true, а код

const a = 3;
const b = -2;
console.log(a && b > 0);

Возвращает false?


Ответы (1 шт):

Автор решения: EzioMercer

Открываем документацию и находим там приоритет операторов. Как видно, абсолютно у всех операторов сравнения приоритет выше чем у логический операторов.

Точно так же как и в математике, где в строчке без скобок приоритет у умножения и деления выше чем у сложения и вычитания. Т.е. мы сначала выполним * и / и только потом с получившимися результатами будем выполнять операции + и -.

Следовательно, когда мы пишем (буду без переменных писать значения):

3 && -2 > 0

то сначала выполняется сравнение и мы получаем:

3 && false

далее работает правило (*): Если левая часть может быть конвертирована в false, то будет возвращено левая часть иначе возвращается правая часть. 3 НЕ может быть конвертирован в false, следовательно возвращается правая часть и мы получаем false

Когда же мы пишем:

-2 && 3 > 0

то точно по такой же логике мы сначала получаем:

-2 && true

далее по правилу (*) мы получаем true т.к. отрицательные числа тоже НЕ могут быть конвертированы в false, значит возвращается правая часть

Более подробно можно прочитать здесь

Небольшое отступление

По поводу правила (*). Я до замечания Grundy писал, что они оба преращаются в булевы значения и только потом мы получаем результат. Это просто универская дискретная математика у меня в голове осталась, где в конце должно быть либо 0 либо 1 :)

Но в JS это работает по другой логике и это очень важно (логический опреатор И):

  • Во первых может ли быть конвертировано значение в true или false проверяется ТОЛЬКО для левой части выражения
  • Из-за этого правила очень важно писать всё в нужном порядке иначе можно получить совершенно другой результат

Простой пример:

3 && 1 --> 1

но в обратном порядке:

1 && 3 --> 3

В обоих случаях левая часть может быть конвертирована в true потому мы получаем разный результат для разной последовательности

Точно такая же логика работает и со значениями false.

Например:

0 && '' --> 0

но в обратном порядке

'' && 0 --> ''

Конвертировать все значения в булевые и смотреть на конечный результат полезно, когда логическое оператор используется например в каком-либо условии

Например нам без разницы между таким выражением:

if (3 && 1)

и варажением:

if (1 && 3)

Блок if отработает в любом случае

→ Ссылка