下面的功能按预期运行,除了注释中注明的情况(即每个数字)
fizz
而不是该数字buzz
而不是该数字。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。
答案 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 % 3
和15 % 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'