这个嵌套的switch语句有什么问题?

What's wrong with this nested switch statement?

本文关键字:什么 问题 语句 switch 嵌套      更新时间:2023-09-26

该语句返回1-100之间的所有数字,但不应用fizz-buzz规则。不知道为什么。你能解释一下吗?

for (var number = 1; number <= 100; number++) {
  switch(number) {
  case number % 3 == 0:
    console.log('Fizz');
    break;
  case number % 5 == 0:
    console.log('Buzz');
    break;
  case number % 5 == 0 && number % 3 == 0:
    console.log('FizzBuzz');
    break;
  default:
    console.log(number);
    break;
  }
}

您正在将数字与布尔表达式进行比较。该开关相当于:

if (number == (number % 3 == 0)) {
  console.log('Fizz');
} else if (number == (number % 5 == 0)) {
  console.log('Buzz');
} else if (number == (number % 5 == 0 && number % 3 == 0)) {
  console.log('FizzBuzz');
} else {
  console.log(number);
}

使用if语句代替开关,并首先检查双条件:

if (number % 5 == 0 && number % 3 == 0) {
  console.log('FizzBuzz');
} else if (number % 3 == 0) {
  console.log('Fizz');
} else if (number % 5 == 0) {
  console.log('Buzz');
} else {
  console.log(number);
}

number与case表达式匹配,因此如果number为3,则不匹配"number % 3 == 0",因为"number % 3 == 0"为真,而不是3

你的代码永远不会达到以下情况:

case number % 5 == 0 && number % 3 == 0

因为它已经进入了第一个大小写:

case number % 3 == 0:
解决这个问题的一种方法是将语句更改为:
case number % 3 == 0 && number % 5 != 0
case number % 5 == 0 && number % 3 != 0