Мне удалось решить проблему с 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)
}В чем проблема этого кода и почему переменная итерации не работает для всех чисел?
Добро пожаловать в Stack Overflow. Поздравляю с первым ответом.
Поинти, я могу напечатать все 100 чисел. Проблема в том, что некоторые числа не выполняют код, например число 10. Остальные работают нормально.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша проблема в else if. Линия
} else if (j % 5 === 0 && j % 3 === 0) {
находится в операторе else и никогда не будет выполняться, если одно из других операторов истинно (либо j % 3 == 0, либо j % 5 == 0), то есть - этого никогда не произойдет
Я не думаю, что это настоящая проблема, но это ошибка. Реальная проблема заключается в том, что как только j установлен на "fizz", он станет NaN, когда j++ оценивается в заголовке цикла.
Используйте другую переменную вместо 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 Ваш код не запускается на 10, потому что j установлен на fizz прямо перед этим из-за 9. Остальное работает нормально, потому что, когда никакие условия не совпадают, вы устанавливаете j обратно на допустимое число, выполняя j = i
и он снова возвращается к работе, потому что, когда условие в 10 не соответствует j, снова устанавливается на действительное число в вашем условии else.
Есть идеи, почему код ломается, если я устанавливаю "fizzbuzz" просто на условное "if" вместо "else if"?
@JSMaster Ага, когда выполнение достигает 3, j изменяется на fizz, а затем он переходит к проверке измененного условия if (fizzbuzz) и видит, что условие ложно, и, следовательно, выполняет блок else, который устанавливает j обратно в 3, что получает зарегистрирован.
После установки
jна одну из строк,j++в заголовке цикла больше не будет работать.