Условия\Умные весы запись условия через двойное неравенство

Всем здравствуйте!

Объясните, пожалуйста, почему, если записать условие в формате двойного неравенства

if ( weight < 4 ) {
recommendation = ‘Пора перекусить’;
} else if ( 4 <= weight <=5.5 ){
recommendation = ‘Вес в норме’;
} else if ( weight > 5.5 ){
recommendation = ‘Пора на тренировку’;
}

выполняется 3 из 4 проверок.

Если же записать условие через логический оператор &&, то успешно выполняются все 4 проверки.

if ( weight < 4 ) {
recommendation = ‘Пора перекусить’;
} else if ( weight >= 4 && weight <=5.5 ){
recommendation = ‘Вес в норме’;
} else if ( weight > 5.5 ){
recommendation = ‘Пора на тренировку’;

всегда помним, что значение внутри скобочек в if должно возвращать true, чтобы исполнилось тело условия. также, JS последовательно исполняет операторы в порядке их приоритета слева направо (как правило).
представьте, что первая проверка дает всегда false, чтобы пройти на вторую:

Сводка
if ( false ) {
recommendation = 'Пора перекусить';
} else if (4 >= weight  <= 5.5 ){
recommendation = 'Вес в норме';
} else {
recommendation = 'Пора на тренировку';
}

мы сравниваем 4 и weight, независимо от значения weight мы получим false или true, т.е. 0 или 1. и вот их сравниваем с <= 5.5.
Т.к. 0 или 1 меньше 5.5, то в ответ всегда будем иметь true в результате второй проверки на условие (до третьей в принципе не дойдет и значение ‘Пора на тренировку’ мы никогда не получим).
Поэтому у вас и срабатывает 3 из 4 проверок (1 тест на первое условие, 2 теста на второе условие, 1 тест на третье условие).

Вообще конечно не рекомендуется использовать в сравнении в левой части число, а справа переменную. Да и в принципе двойные неравенства лучше не использовать, из-за непредсказуемости (на первый взгляд) логики JS. Используйте логику &&.

оффтоп

а знаете, вы меня толкнули на интересную мыслю.
а что, если вообще убрать >= 4?
ведь мы имеем дело с 3 интервалами: от минус-бесконечности до 4 включительно, от 4 невключительно до 5.5 включительно, от 5.5 невключительно до плюс-бесконечности.
получается достаточно прописать, что будет меньше 4, меньше либо равно 5.5 и иначе =)

1 лайк

Перечитав раза 3 ответ, делаю для себя вывод, что

Да и в принципе двойные неравенства лучше не использовать, из-за непредсказуемости (на первый взгляд) логики JS. Используйте логику &&.

Спасибо за столь развернутый ответ) Я его ещё перечитаю, когда под рукой будет ручка, чистый лист и свежая голова :smile: