Я только изучаю JavaScript и подумал, что хороший способ начать - это написать мой собственный ролик для игры в кости для ролевой игры, в которую я играю. В этой игре вы бросаете горстку шестигранных кубиков, где каждые 4 или 5 дают один успех, а каждые 6 дают 2 успеха.
У меня есть функция, которая бросает кости и передает их через массив другой функции, которая HTML-кодирует ее для отображения на веб-странице.
Чтобы бросить кости, у меня есть то, что я считаю стандартной функцией ролика кубиков (переменная sides связана с тем, что иногда вы можете бросать кубики со сторонами, отличными от 6, поэтому я сделал эту функцию пригодной для всех бросков кубиков):
function rollDice(sides) {
return Math.floor(Math.random()*sides) + 1;
}
Поскольку количество костей, которые вы бросаете, варьируется, моя основная функция вызывает эту функцию rollDice() несколько раз и помещает каждый результат в массив.
Это основная функция, где number - количество бросаемых кубиков:
function dice(number) {
let results = [];
for (i=0; i<number; i++){
results.push(rollDice(6));
}
return results;
}
Однако с тех пор я узнал о цикле do…while и сумел реорганизовать его следующим образом:
function dice(number) {
let results = [];
do {
results.push(rollDice(6));
} while (results.length < number)
return results;
}
Какой цикл более «правильный» или лучший для использования? for или do…while?
Однако подумайте, что вы хотите, когда number меньше единицы.
Зависит от ваших требований. Do ... Пока цикл запускается хотя бы один раз, если условие не совпадает, когда цикл for запускается только при совпадении условий
если number никогда не дотрагивается до 0 или ниже, я думаю, что do... while подойдет. но я действительно редко вижу do... while на собственном опыте.
Я согласен со всеми, кто говорит, что ты редко видишь ... в дикой природе, хотя нет ничего НЕПРАВИЛЬНОГО в том, чтобы использовать его в правильной ситуации. Однако я добавлю, что в школе мне не рекомендовали использовать его по причинам, аналогичным тем, которые были изложены в этом вопросе: stackoverflow.com/questions/994905/…. Однако это немного субъективно :)
Если вы еще не исследовали его, вас также может заинтересовать forEachdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Поскольку вы всегда бросаете хотя бы один кубик, number никогда не будет меньше 1.



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


Вы можете просто использовать простой цикл while, который эквивалентен вашему примеру цикла for.
function dice(number) {
let results = [];
while (results.length < number) {
results.push(rollDice(6));
}
return results;
}
Мне больше всего нравится его удобочитаемость (отчасти потому, что он не создает дополнительную переменную итератора), но цикл for тоже подойдет. Цикл do...while работает, но дополнительный синтаксис не нужен.
Ха, я даже не подумал о простом шлейфе while. Спасибо!
Циклы
forопределенно более распространены, и я бы не стал дважды рассматривать первый пример. Но, как вы обнаружили, петлиdo...whileв некоторых ситуациях могут обеспечить очень приятное решение! Я бы не сказал, что одно из них более правильное, чем другое.