Проблема в том, что вы включаете 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
).
Если вы использовали &&
, то выражение &&
будет иметь значение first falsey , вместо того, чтобы оба %
сразрешить до 0
, например, когда i
равно 3:
case (3 % 3 && 3 % 5)
->
case (0 && 2)
->
case 0
, что затем соответствует foo
s 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)