multik8711
Совет: когда не работает логическая цепь и глаза замылились, лучше стереть всё и переписать заново.
В чём смысл проверять наличие "а" в условиях? else if (b < c && a && a >=c)
вот здесь вторым условием цепи? функция принимает на вход три аргумента, если будет передано только два, то они будут назначены переменным "a" и "b", если передать только один аргумент, то будет назначен только "а" - значит нет смысла проверять его наличие. Кроме того, оператор && вернет false если хоть один из аргументов равен нулю, false, undefined, etc. это значит, что если в функцию передадут меньше трех аргументов, все проверки посыпятся до else{}
Тем не менее, давайте разберём ваш код по шагам, как это сделал бы я сам, если бы запутался:
- Первый if условия (a < b && c && b <= c)
здесь мы предполагаем, что "а" наименьший из переданных аргументов.
если все условия верны, то мы получаем такую картину: "а" меньше "b", которое меньше или равно "с"
! разве не может так случиться, что "b" будет больше "с" и больше "а"
min(1, 200, 15) a=1 b=200 c=15
здесь "а" будет меньшим и ваша функция обработает его неверно
=> лучше первое условие описать так: if (a <= b && a <= c)
таким образом, мы напрямую проверим, что
аргумент "а" меньше остальных переданных аргументов.
-Второй if условия (b < c && a && a >= c)
Здесь мы предполагаем, что аргумент b наименьший из переданных.
Если все условия верны, то "b" меньше "с", которое меньше "а"
! Та же ситуация, аргумент "а" может быть меньше "с" и вместе с тем, больше "b"
=> лучше описать условия похожим с первым шагом образом else if (b <= c && b <= a)
-Третeе if условие (c < a && b >= a)
Как и в первых двух, мы получаем двойственную картину, в которой "c" меньше "а" и "b" больше "а"
с=5 а=10 b=8
=> если мы описываем алгоритм как я предложил выше, то дополнительных условий больше не нужны, здесь мы ставим блок else и возвращаем из него аргумент "с"
(Если не понятно, первой проверкой мы предположили, что "а" точно наименьшее, если это не верно, то во второй проверке мы предполагаем, что "b" наименьшее, если и это не верно, то методом исключения остается только аргумент "с")
Почему "<=", а не строгое "<" ? Чтобы предупредить ситуацию когда в функцию будут переданы одинаковые аргументы.
Полный листинг функции:
export const min = (a, b, c) {
if (a <= b && a <= c) {
return a;
} else if ( b <= a && b <= c) {
return b;
} else {
return c;
}
}
Если хотите потренироваться в написании логических цепочек: опишите эту же функцию но с переменным количеством аргументов - так, чтобы функция не ломалась, если в неё передадут только "а" или только "а" и "b" или ничего.