JS 逻辑运算符 - switch 语句中的 OR, AND ('||', '&&')

JS Logical operators - OR, AND ('||', '&&') in switch statement

除了评论中注意到的情况外,以下功能按预期工作,即对于每个数字:

示例 - 1

const FizzBuzz = (num) => {
 for (let i = 1; i <= num; i++) {
  const foo = 0;
  switch (foo) {
   case (i % 3 || i % 5): console.log('fizzbuzz');
   // expect in this case should be work with logical operator '&&': (i % 3 && i % 5)
    break;
   case i % 3: console.log('fizz');
    break;
   case i % 5: console.log('buzz');
    break;
   default: console.log(i);
  }
 }
}

FizzBuzz(20)

我是这样知道的 - 最好使用 switch-case 语句:

示例 2

switch(true) {
    case (i % 3 === 0 && i % 5 === 0): console.log('fizzbuzz');
    break;
    // etc...
}

但是对于上面的代码实例(示例 1:其中 switch(foo) 没有像 true 那样的常量值),它看起来更加灵活和可读。 在 "Example 1" 中,据我了解,运算符 || 的工作方式类似于运算符 &&,反之亦然。

"Example 1" 结果完美运行。但我不明白为什么。我的主要问题是 - 为什么逻辑运算符 OR 在此示例中表现为运算符 AND

提前致谢。

示例 1 中的代码之所以有效,是因为您打开了设置为 0 的变量 foo。 第一种情况下的代码被评估为 0:

15 % 3 || 15 % 5 = 0

这个值与 0 的 foo 进行比较,因此 JS 代码进入第一种情况。

在 JavaScript 逻辑或运算符中总是 return 第一个 "truthy" 值。

'foo' || 'bar' = 'foo'
false || 'bar' = 'bar'

问题是您正在打开 foo,并且 foo 为 0,因此 case <expression> 将 运行 当 <expression> 计算为 0.

因此,case i % 3 运行 是预期的,因为您希望 i % 3 的情况在计算结果为 0 时变为 运行。与 i % 5 相同.但是

case (i % 3 || i % 5)

,当i是15的倍数时,解析为

case (15 % 3 || 15 % 5)

->

case (0 || 0)

因为 0 是假的,|| 将意味着 15 % 315 % 5 必须是 0 那里的 case 解析为 0(因此匹配 foo0)。

如果您使用了 &&,那么 && 表达式的计算结果将是 第一个假值 ,而不需要 两者 %s 解析为 0,例如当 i 为 3:

case (3 % 3 && 3 % 5)

->

case (0 && 2)

->

case 0

然后匹配 foo0,尽管 && 中只有一个条件解析为 0。

这非常不直观。不要在这里使用 switch。如果您必须使用 switch,我强烈建议您将 foo 设置为 true,并使用 === 0 测试:

const FizzBuzz = (num) => {
  for (let i = 1; i <= num; i++) {
    const foo = true;
    switch (foo) {
      case i % 3 === 0 && i % 5 === 0:
        console.log('fizzbuzz');
        break;
      case i % 3 === 0:
        console.log('fizz');
        break;
      case i % 5 === 0:
        console.log('buzz');
        break;
      default:
        console.log(i);
    }
  }
}

FizzBuzz(20)