【问题标题】:JS Logical operators - OR, AND ('||', '&&') in switch statementJS 逻辑运算符 - 在 switch 语句中的 OR、AND ('||'、'&&')
【发布时间】:2019-02-08 10:02:03
【问题描述】:

以下函数按预期工作,但注释中注意到的情况除外,即对于每个数字:

  • 如果该数字可以被三整除,我想注销单词fizz 而不是那个数字
  • 如果该数字可以被 5 整除,我想注销单词 buzz 而不是该数字。
  • 如果一个数字可以被 3 和 5 整除,我想注销单词 fizzbuzz 而不是那个数字。

示例 - 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 这样的常量值),它看起来更加灵活和可读。 据我了解,在“示例 1”中,运算符 || 的工作方式与运算符 &amp;&amp; 类似,反之亦然。

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

提前谢谢。

【问题讨论】:

  • 你在例子2中有一个正确的大小写,但是你没有在例子1中进行比较。(i % 3 || i % 5)你需要使用===
  • 不,对于这个练习,你绝对不应该使用switch

标签: javascript switch-statement logical-operators


【解决方案1】:

问题是您打开foo,而foo 为0,所以case &lt;expression&gt; 将在&lt;expression&gt; 评估为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)。

如果您使用了&amp;&amp;,那么&amp;&amp; 表达式将评估为第一个错误值,而不是要求两者 %s 解析为@ 987654345@,例如i 为 3 时:

case (3 % 3 && 3 % 5)

->

case (0 && 2)

->

case 0

然后匹配foo0,尽管&amp;&amp; 中只有一个条件解析为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)

【讨论】:

  • 是的,完全正确!我一直忽略0 等于false,现在我了解到switch 语句在case 的值与标头表达式的匹配中具有严格的比较。谢谢!希望这个问题对某人有用。
【解决方案2】:

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

15 % 3 || 15 % 5 = 0

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

在 JavaScript 中,逻辑 OR 运算符总是返回第一个“真实”值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多