Объясните по поводу && в 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 шт):
Открываем документацию и находим там приоритет операторов. Как видно, абсолютно у всех операторов сравнения приоритет выше чем у логический операторов.
Точно так же как и в математике, где в строчке без скобок приоритет у умножения и деления выше чем у сложения и вычитания. Т.е. мы сначала выполним * и / и только потом с получившимися результатами будем выполнять операции + и -.
Следовательно, когда мы пишем (буду без переменных писать значения):
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 отработает в любом случае