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

问题描述 投票:0回答:2

下面的函数工作正常的情况下,除了在注释中发现,即每个号码:

  • 如果该号码被3除尽,我想fizz而不是退出这个数字的话
  • 如果数字是五整除我想退出的话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)

这是我知道的 - 随着开关case语句最好使用:

实施例2

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

但是,随着上述代码(实施例1:其中switch(foo)不具有恒定值等true)实例,它看起来更灵活和可读性。而在“实施例1”,我的理解,||就像操作者&&反之亦然操作者。

在“实施例1”完美的作品作为结果。但我不明白为什么。主要是我的问题是 - 为什么逻辑运算符OR表现为在这个例子中操作AND

提前致谢。

javascript switch-statement logical-operators
2个回答
1
投票

问题是,你在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是falsey,该||将意味着两个15 % 315 % 5必须0case有解析到0(从而匹配foo0)。

如果您使用&&,那么&&表达式会第一falsey值,而不是同时需要%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)

0
投票

在实施例1中的代码有效,因为您切换在其上被设置为0的第一种情况下的代码进行评估,以0变量foo的:

15 % 3 || 15 % 5 = 0

这个值被比较为foo是0,因此JS代码进入第一壳体。

在JavaScript逻辑OR运算符总是返回的第一个“truthy”值。

'foo' || 'bar' = 'foo'
false || 'bar' = 'bar'
© www.soinside.com 2019 - 2024. All rights reserved.