Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

Есть ли разница между выражениями !!( a && b ) и (a && b)?

В тесте встретил данный вопрос, ответил "нет" так как считаю, что двойное отрицание должно вернуть то же самое значение, но правильный ответ "да", подскажите почему.


Ответ

Для начала приведу немного теории.
На самом деле, в JavaScript логические операторы || и && работают особым образом.
Оператор || возвращает первый из операндов, значение которого может быть приведено к логическому true. Если же оба операнда приводятся к логическому false, то оператор || вернет последнее значение
console.log('foo' || false); // 'foo' console.log(null || 'bar'); // 'bar' console.log(false || 1); // 1 console.log(false || null); // null
Это позволяет использовать всеми любимый широко известный хак со значением переменной по умолчанию:
function f(arg) { var a = arg || 0; // ... }
Оператор && возвращает первый из операндов, значение которого приводится к логическому false. Если же оба операнда приводятся к true, то оператор && вернет последний операнд
console.log(true && []); // [] console.log(null && 'foo'); // null console.log(0 && 'foo'); // 0 console.log('foo' && 'bar'); // 'bar'
Что касается конструкции !!, то она используется для явного приведения операнда к логическому типу:
console.log(!!'foo'); // true console.log(!!''); // false console.log(!!0); // false console.log(!!1); // true

Вернемся к вашему вопросу.
Как вы уже могли догадаться, разница между выражениями
!!(a && b); // (1) (a && b); // (2)
заключается в типе возвращаемого значения. Если обе переменные a и b оба имеют логический тип, то эти выражения эквивалентны. В общем же случае, тип результата выражения (2) определяется типом операндов, тогда как выражение (1) всегда возвращает значение логического типа.

Комментариев нет:

Отправить комментарий