JS Логические операторы - ИЛИ, И ('||', '&&') в операторе переключения - PullRequest
0 голосов
/ 08 февраля 2019

Следующая функция работает, как и ожидалось, за исключением случая, отмеченного в комментарии, а именно для каждого числа:

  • если число делится на три, я хочу вместо этого выйти из слова fizzиз этого числа
  • если число делится на пять, я хочу выйти из слова 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 в этом примере ??

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Проблема в том, что вы включаете 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)
0 голосов
/ 08 февраля 2019

Код в Примере 1 работает, потому что вы включаете переменную foo, которая установлена ​​в 0. Код в первом случае оценивается в 0:

15 % 3 || 15 % 5 = 0

Это значение сравнивается с foo, которое0 и поэтому код JS входит в первый регистр.

В JavaScript логические операторы ИЛИ всегда возвращают первое «истинное» значение.

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