JS 逻辑运算符 - switch 语句中的 OR, AND ('||', '&&')
JS Logical operators - OR, AND ('||', '&&') in switch statement
除了评论中注意到的情况外,以下功能按预期工作,即对于每个数字:
- 如果数字可以被三整除我想注销单词
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
那样的常量值),它看起来更加灵活和可读。
在 "Example 1" 中,据我了解,运算符 ||
的工作方式类似于运算符 &&
,反之亦然。
"Example 1" 结果完美运行。但我不明白为什么。我的主要问题是 - 为什么逻辑运算符 OR
在此示例中表现为运算符 AND
?
提前致谢。
示例 1 中的代码之所以有效,是因为您打开了设置为 0 的变量 foo。
第一种情况下的代码被评估为 0:
15 % 3 || 15 % 5 = 0
这个值与 0 的 foo 进行比较,因此 JS 代码进入第一种情况。
在 JavaScript 逻辑或运算符中总是 return 第一个 "truthy" 值。
'foo' || 'bar' = 'foo'
false || 'bar' = 'bar'
问题是您正在打开 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
是假的,||
将意味着 15 % 3
和 15 % 5
必须是 0
那里的 case
解析为 0
(因此匹配 foo
的 0
)。
如果您使用了 &&
,那么 &&
表达式的计算结果将是 第一个假值 ,而不需要 两者 %
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)
除了评论中注意到的情况外,以下功能按预期工作,即对于每个数字:
- 如果数字可以被三整除我想注销单词
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
那样的常量值),它看起来更加灵活和可读。
在 "Example 1" 中,据我了解,运算符 ||
的工作方式类似于运算符 &&
,反之亦然。
"Example 1" 结果完美运行。但我不明白为什么。我的主要问题是 - 为什么逻辑运算符 OR
在此示例中表现为运算符 AND
?
提前致谢。
示例 1 中的代码之所以有效,是因为您打开了设置为 0 的变量 foo。 第一种情况下的代码被评估为 0:
15 % 3 || 15 % 5 = 0
这个值与 0 的 foo 进行比较,因此 JS 代码进入第一种情况。
在 JavaScript 逻辑或运算符中总是 return 第一个 "truthy" 值。
'foo' || 'bar' = 'foo'
false || 'bar' = 'bar'
问题是您正在打开 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
是假的,||
将意味着 15 % 3
和 15 % 5
必须是 0
那里的 case
解析为 0
(因此匹配 foo
的 0
)。
如果您使用了 &&
,那么 &&
表达式的计算结果将是 第一个假值 ,而不需要 两者 %
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)