Возвращаемые значения || и &&
У || и && результат – один из операндов, а не true/false. Этот урок – о том, какой именно операнд возвращается и что из этого следует.
const nick = 0 || 'Ира' || 'Гость';// 'Ира' – не true и не falseconsole.log(nick);В nick – строка 'Ира', а не true. || не создаёт новое булево значение: его результат – одно из исходных значений цепочки. Вычисление идёт слева направо:
- Очередной операнд конвертируется в логическое значение. Сам операнд при этом не меняется.
- Получилось
true– стоп: результат – исходное значение этого операнда. В примере это'Ира'. - Получилось
false– переход к следующему операнду: так пройден0. - Ложными оказались все – результат – последний операнд цепочки.
Другими словами: цепочка || возвращает первое истинное значение, а если такого нет – последнее.
Взгляните сами – по шагам:
0 – ложное значение: переходим к следующему операнду.Значение по умолчанию
На возврате значений построен частый приём с || – запасное значение: const name = savedName || 'Гость'. Если имя сохранено – берём его, если нет – подставляем «Гостя».
Но у приёма есть ограничение: || подставляет запасное вместо любого ложного значения, включая 0 и пустую строку. А ноль часто – законные данные: количество товара, громкость, счёт игры. 0 || 100 вернёт 100 – ноль заменён запасным, хотя это были данные. Договоримся так: ||-дефолт годится там, где ноль и пустая строка не являются осмысленными данными.
// имя не сохраненоconst savedName = '';// 'Гость' – подставили запасноеconsole.log(savedName || 'Гость');// звук выключен – это данные!const savedVolume = 0;// 50 – ноль ложный, вернулось запасноеconsole.log(savedVolume || 50);const bonus = 'ок' && 0 && 'приз';console.log(bonus); // 0У && алгоритм зеркальный: та же цепочка слева направо, та же конвертация каждого операнда – но роли true и false меняются местами:
- Очередной операнд конвертируется в логическое значение.
- Получилось
false– стоп: результат – исходное значение этого операнда. В примере это0. - Получилось
true– переход к следующему операнду:'ок'пройден. - Истинными оказались все – результат – последний операнд цепочки.
Другими словами: цепочка && возвращает первое ложное значение, а если ложных нет – последнее.
И снова по шагам:
'ок' – истинное: переходим к следующему операнду.Ещё несколько цепочек:
// null – ложное первым же, дальше не пошлоconsole.log(null && 'бонус');// '' – пустая строка ложнаяconsole.log('' && 'приз');// 'пароль' – оба истинные, вернулся последнийconsole.log('логин' && 'пароль');// 0 – первое ложное оказалось последнимconsole.log(7 && 'семь' && 0);В обоих степперах операнды правее точки остановки не вычислялись – это называют коротким замыканием. Пропускается не только вычисление значения: вызов функции в правой части тоже не произойдёт:
const isReady = false;// тишина: до правой части не дошлоisReady && console.log('поехали');// тишина: ответ определён левым операндомtrue || console.log('не дойдёт');// 'дошло' – без правой части ответа нетfalse || console.log('дошло');Раз правая часть может не выполниться, её используют как действие с условием: isReady && console.log('поехали') напечатает строку, только если слева истина. Читать такое вы будете часто; писать – умеренно: для действий обычно пишут if.
// теперь вы знаете
||и&&возвращают исходный операнд:||– первый истинный,&&– первый ложный; не нашлось – последний- Оба вычисляют операнды слева направо и останавливаются, как только ответ определён
- Короткое замыкание: правая часть может не вычисляться вовсе
- ||-дефолт подставляет запасное вместо 0 и пустой строки – годится не для всяких данных
Что вернёт undefined || 0 || 'да'?
Что напечатает console.log(1 && 0 && 'три')?
Что возвращают эти два выражения?
'Ира' || 'Гость'Boolean('Ира' || 'Гость')
Отметьте выражения, результат которых – строка 'Гость'.
Выбери все верные варианты
Громкость сохранена как 0. Что выведет console.log(0 || 30)?