Как сделать цикл, который выводит числа от 0 до 9?
Что проверяют
Разминочный вопрос на скрининге. Смотрят не на цикл, а на то, что кандидат напишет за десять секунд без раздумий, и вытянет ли следующий за этим вопрос про область видимости и замыкания.
Как отвечать
for (let i = 0; i < 10; i++) {
console.log(i);
}Разбор по частям: let i = 0 выполняется один раз перед первой итерацией, i < 10 проверяется перед каждой итерацией, i++ после тела. Граница именно < 10, а не <= 10: нужно десять значений, от 0 до 9.
Альтернативы, если попросят другой вариант:
let j = 0;
while (j < 10) console.log(j++);
for (const n of Array.from({ length: 10 }, (_, i) => i)) console.log(n);
[...Array(10).keys()].forEach((n) => console.log(n));Оговорка про Array(10).forEach(...): это массив из десяти пустых слотов, forEach их пропускает и не выведет ничего. Поэтому нужен Array.from или .keys(), которые дают реальные элементы.
Follow-up почти всегда один и тот же, про var в асинхронном коде:
for (var i = 0; i < 10; i++) setTimeout(() => console.log(i)); // десять раз 10
for (let i = 0; i < 10; i++) setTimeout(() => console.log(i)); // 0..9Причина не в асинхронности как таковой, а в области видимости: var объявляет одну переменную на всю функцию, все колбэки замыкаются на неё, и к моменту срабатывания таймеров она уже равна 10. let создаёт новую привязку на каждой итерации, поэтому каждый колбэк видит своё значение. Починка на var: обернуть в IIFE или передать значение параметром setTimeout.
Другие обычные продолжения: вывести только чётные (i += 2 либо if (i % 2 === 0)), пройти в обратном порядке, посчитать сумму, объяснить разницу между for...of и for...in (второй итерирует ключи и подхватывает перечислимые свойства прототипа, для массивов не годится).
Где спотыкаются
Ошибаются в границе и выводят от 1 до 10, а на вопросе про var в setTimeout начинают рассказывать про очередь задач вместо реальной причины, то есть про функциональную область видимости var.