JavaScript

Почему это работает?

 let a = 10;
a && console.log('log');
Как это работает? Почему выводится вообще что то если условие было записано не в if а просто в коде?
Как вообще можно сравнить число с выводом? Это же сравнить не сравнимое. Объясните пожалуйста
Андрей Бутов
Андрей Бутов
6 773
Это работает так.
 value1 && value2 && value3; 
Используя оператор &&, значения проверяются с лево на право до тех пор, пока не достигнет falsy значение или конец выражения. Это значение "возвращается".

Например:
 const a = 'a' && 'b' && 'c';
console.log(a); // Выведет 'c'
// выведет последнее значение в цепи && операторов
// потому что все значения являются truthy значениями
 const a = 2 && 4 && 3 && 0 && 6;
console.log(a); // Выведет 0
// первое falsy значение в цепи && операторов
// потому что 0 является falsy значением
Переменная a лишь для наглядности. Можно и так записать:
 console.log('a' && 'b' && 'c'); // выведет 'c'. 
В случае с console.log(a)
 2 && 4 && 3 && console.log(5) && 6; 
Тоже самое в случае с console.log(). console.log() выполняется и возвращает undefined.

Если написать так:
 2 && 0 && 3 && console.log(5) && 6; 
То console.log() не выполнится.
СМ
Семен Митяй
23 960
Лучший ответ
a && console.log('log'); - это просто оператор, состоящий из выражения и вычисляющий это выражение. Если бы ты написал:
q = a && console.log('log');
это было бы тоже просто выражение, но включающее в себя операцию присваивания.

a имеет значение 10, 10 интерпретируется как true, правый операнд операции && выполняется.
Посмотрим возвращает ли правая часть булево значение.
console.log(!!console.log('log'))
Возвращено false. А раз есть булево значение, то почему бы не работать и условию с ним?
Это тернарный оператор, оно должно работать.

В данном случае a - это условие, которое будет проверено по принципу if... если оно равно true, а оно равно true, то будет выполнен алгоритм в правой части.

Если переводить на более привычный синтаксис, то вся эта запись абсолютно идентична вот такой записи... и убедиться в этом не сложно, достаточно просто заменить 10 на 0, который всегда равен false.
 let a = 10;

if (a) {
console.log('log');
}
Правда работает такая запись далеко не в любых ситуациях. Поэтому лучше использовать if в одну строку или полноценный тернарный оператор с false в качестве значения для else.
Mokrushyn Alexander
Mokrushyn Alexander
99 078
Алексей Толдин Это не тернарный оператор.
Нет никаких "полноценных".
Они или есть или его нет.
JS такой язык, позволяет слишком много
Егор Иконников
Егор Иконников
55 095
а где здесь условие? В этой записи нет никаких условий... :)
Андрей Бутов Вот это то мне и непонятно
Алексей Здоров let a = 10;
a;
console.log('log');

Как по твоему, вот такая запись должна работать?