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

时间:2019-02-08 10:02:04

标签: javascript switch-statement logical-operators

下面的功能按预期运行,除了注释中注明的情况(即每个数字)

  • 如果数字可以被三整除,我想注销单词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”中,运算符||的工作方式类似于运算符&&,反之亦然。

“示例1”可以完美地运行。但是我不明白为什么。我的主要问题是-在此示例中,为什么逻辑运算符OR会像运算符AND一样?

提前Thnx。

2 个答案:

答案 0 :(得分:1)

问题是您要打开foo,并且foo为0,所以case <expression>将在<expression>的值为0时运行。 / p>

因此,case i % 3在预期的情况下运行,因为您希望i % 3的情况在其值为0时运行。对于i % 5,情况相同。但是

case (i % 3 || i % 5)

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

case (15 % 3 || 15 % 5)

->

case (0 || 0)

由于0是虚假的,||表示{em> 15 % 315 % 5都必须是0 {1}}解析为case(因此匹配0的{​​{1}})。

如果您使用foo,则0表达式将计算为第一个假值,而不是同时要求 {{1} }解析为&&,例如&&为3时:

%

->

0

->

i

然后与case (3 % 3 && 3 % 5) 的{​​{1}}匹配,尽管case (0 && 2) 中只有一个条件解析为0。

这是非常不直观的。请勿在此处使用case 0 。如果您必须使用foo,我强烈建议您将0设置为&&,并使用switch测试:

switch

答案 1 :(得分:0)

示例1中的代码起作用是因为您打开了设置为0的变量foo。 第一种情况下的代码评估为0:

15 % 3 || 15 % 5 = 0

此值与foo(即0)进行比较,因此JS代码输入了第一种情况。

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

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