Переменная итерации в fizzbuzz не может распечатать все правильные ответы?

Мне удалось решить проблему с fizzbuzz. У меня вопрос по поводу альтернативного метода.

Все отлично, пока я не дойду до числа 10. В консоли число 10 должно печатать «жужжание», но вместо этого оно выводит число 10. После этого он начинает работать правильно. Также, похоже, не работает "fizzbuzz". Если я изменю условное выражение fizzbuzz на просто «если», то код даже не запустится.

for (let i = 1, j = 1; j <= 100, i <= 100; i++, j++) {

  if (j % 3 == 0) {
    j = "fizz";
  } else if (j % 5 == 0) {
    j = "buzz";
  } else if (j % 5 === 0 && j % 3 === 0) {

    j = "fizzbuzz";

  } else {
    j = i;
  }
  console.info(j)
}

В чем проблема этого кода и почему переменная итерации не работает для всех чисел?

После установки j на одну из строк, j++ в заголовке цикла больше не будет работать.

Pointy 28.05.2018 14:32

Добро пожаловать в Stack Overflow. Поздравляю с первым ответом.

aloisdg 28.05.2018 14:36

Поинти, я могу напечатать все 100 чисел. Проблема в том, что некоторые числа не выполняют код, например число 10. Остальные работают нормально.

JSMastery 28.05.2018 14:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
45
2

Ответы 2

Ваша проблема в else if. Линия

} else if (j % 5 === 0 && j % 3 === 0) {

находится в операторе else и никогда не будет выполняться, если одно из других операторов истинно (либо j % 3 == 0, либо j % 5 == 0), то есть - этого никогда не произойдет

Я не думаю, что это настоящая проблема, но это ошибка. Реальная проблема заключается в том, что как только j установлен на "fizz", он станет NaN, когда j++ оценивается в заголовке цикла.

Pointy 28.05.2018 14:34

Используйте другую переменную вместо j

for (let i = 1, j = 1; j <= 100, i <= 100; i++, j++) {
   var res;
  if (j % 3 == 0) {
    res = "fizz";
  } else if (j % 5 == 0) {
    res = "buzz";
  } else if (j % 5 === 0 && j % 3 === 0) {

    res = "fizzbuzz";

  } else {
    res = i;
  }
  console.info(res)
}

Вы также должны сначала поставить условие fizzbuzz, чтобы оно было достигнуто, когда оно истинно (также вы можете исключить цикл i), например

for (let j = 1; j <= 100, j++) {
      let res;
      if (j % 5 === 0 && j % 3 === 0) {

        res = "fizzbuzz";

      }
      else if (j % 3 == 0) {
        res = "fizz";
      } else if (j % 5 == 0) {
        res = "buzz";
      }else {
        res = j;
      }
      console.info(res)
    }

Это работает, но это более традиционный ответ. Я искал альтернативный метод и пытался понять, почему этот код работает до тех пор, пока не достигнет числа 10, а затем снова вернется к работе.

JSMastery 28.05.2018 14:44

@JSMastery Ваш код не запускается на 10, потому что j установлен на fizz прямо перед этим из-за 9. Остальное работает нормально, потому что, когда никакие условия не совпадают, вы устанавливаете j обратно на допустимое число, выполняя j = i

supra28 28.05.2018 14:52

и он снова возвращается к работе, потому что, когда условие в 10 не соответствует j, снова устанавливается на действительное число в вашем условии else.

supra28 28.05.2018 14:53

Есть идеи, почему код ломается, если я устанавливаю "fizzbuzz" просто на условное "if" вместо "else if"?

JSMastery 28.05.2018 14:54

@JSMaster Ага, когда выполнение достигает 3, j изменяется на fizz, а затем он переходит к проверке измененного условия if (fizzbuzz) и видит, что условие ложно, и, следовательно, выполняет блок else, который устанавливает j обратно в 3, что получает зарегистрирован.

supra28 28.05.2018 15:00

Другие вопросы по теме