下面的函数工作正常的情况下,除了在注释中发现,即每个号码:
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)
这是我知道的 - 随着开关case语句最好使用:
实施例2
switch(true) {
case (i % 3 === 0 && i % 5 === 0): console.log('fizzbuzz');
break;
// etc...
}
但是,随着上述代码(实施例1:其中switch(foo)
不具有恒定值等true
)实例,它看起来更灵活和可读性。而在“实施例1”,我的理解,||
就像操作者&&
反之亦然操作者。
在“实施例1”完美的作品作为结果。但我不明白为什么。主要是我的问题是 - 为什么逻辑运算符OR
表现为在这个例子中操作AND
?
提前致谢。
问题是,你在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 % 3
和15 % 5
必须0
为case
有解析到0
(从而匹配foo
的0
)。
如果您使用&&
,那么&&
表达式会第一falsey值,而不是同时需要%
s解析为0
,例如,当i
为3:
case (3 % 3 && 3 % 5)
->
case (0 && 2)
->
case 0
然后匹配foo
的0
,尽管只在&&
的条件之一消退至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)
在实施例1中的代码有效,因为您切换在其上被设置为0的第一种情况下的代码进行评估,以0变量foo的:
15 % 3 || 15 % 5 = 0
这个值被比较为foo是0,因此JS代码进入第一壳体。
在JavaScript逻辑OR运算符总是返回的第一个“truthy”值。
'foo' || 'bar' = 'foo'
false || 'bar' = 'bar'