Страницы

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

пятница, 13 декабря 2019 г.

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

#javascript


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


Ответы

Ответ 1



Для начала приведу немного теории. На самом деле, в 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) всегда возвращает значение логического типа.

Ответ 2



Наверное потому что в случае !!(a && b) происходит преобразование в boolean. А в случае (a && b) не происходит.

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

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