Оператор Switch продолжает записывать значение по умолчанию? - PullRequest
0 голосов
/ 10 апреля 2020
var income = parseInt(prompt('Please enter your income 
   here.'))





switch (income){
   case (income < 9701):
       console.log ('Your tax rate is 10%');
           break;
   case (income > 9700 && income <= 39475):
       console.log('Your tax rate is 12%');
           break;
    case (income > 39475 && income <= 84200):
       console.log('Your tax rate is 22%');
           break;
   case (income > 84200 && income <= 160725):
       console.log('Your tax rate is 24%');
           break;
   case (income > 160725 && income <= 204100):
       console.log('Your tax rate is 32%');
           break;
   case (income > 204100 && income <= 510300):
       console.log('Your tax rate is 35%');
           break;
   case (income >= 510300):
       console.log('Your tax rate is 37%');
           break;
   default:
       console.log('Please enter a valid income')

}

Почему этот код продолжает записывать значение «по умолчанию» на консоль? Если я ставлю знак равенства в кейсе, т. Е. Случае (доход = 9700) и вводим 9700, то он записывает в журнал («Ваша налоговая ставка составляет 10%»). Когда я использую операторы больше / меньше или равны, код переходит по умолчанию.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Точно так же, как большинство людей сказали в комментариях, вы не можете использовать оператор переключения таким образом. Более подробный ответ см. Здесь: Оператор переключения для значений больше / меньше

Если вы хотите переключить свое решение на логическое решение IF / ELSE, вот один из примеров как отформатировать ваш код с помощью oneliners (троичные операторы):

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

var income = parseInt(prompt('Please enter your income here.'))

var currentTaxBracket 
= income < 9701 ? 'Your tax rate is 10%' 
: income > 9700 && income <= 39475 ? 'Your tax rate is 12%'
: income > 39475 && income <= 84200 ? 'Your tax rate is 22%'
: income > 84200 && income <= 160725 ? 'Your tax rate is 24%'
: income > 160725 && income <= 204100 ? 'Your tax rate is 32%'
: income > 160725 && income <= 204100 ? 'Your tax rate is 35%'
: income >= 510300 ? 'Your tax rate is 37%'
: 'Please enter a valid income'

alert(currentTaxBracket)
0 голосов
/ 10 апреля 2020

Вы можете взять функцию с подходом раннего выхода и проверить значение от наименьшего до наибольшего и пропустить необязательные проверки.

function getTaxRate(income) {
    if (income < 9701) return 10;
    if (income <= 39475) return 12;
    if (income <= 84200) return 22;
    if (income <= 160725) return 24;
    if (income <= 204100) return 32;
    if (income <= 510300) return 35;
    return 37;
}

var income = parseInt(prompt('Please enter your income here.')),
    rate = income > 0 && getTaxRate(income);

console.log(rate
    ? `Your tax rate is ${rate}%`
    : 'Please enter a valid income'
);
0 голосов
/ 10 апреля 2020

Оператор switch не похож на оператор if, он выполняет строгое сравнение, которое означает, что значение и тип должны совпадать, в вашем случае вы говорите number === boolean, что всегда будет ложным, и поведение по умолчанию будет вызывать triggererd.

Просто измените ie значение для проверки в вашем операторе switch следующим образом:

switch(true){
  case(income < 9701):
    console.log ('Your tax rate is 10%'); break;
  case(income > 9700 && income <= 39475):
    console.log('Your tax rate is 12%'); break;
  case(income > 39475 && income <= 84200):
    console.log('Your tax rate is 22%'); break;
  case(income > 84200 && income <= 160725):
    console.log('Your tax rate is 24%'); break;
  case(income > 160725 && income <= 204100):
    console.log('Your tax rate is 32%'); break;
  case (income > 204100 && income <= 510300):
    console.log('Your tax rate is 35%'); break;
  case (income >= 510300):
    console.log('Your tax rate is 37%'); break;
  default:
    console.log('Please enter a valid income')
}
...